C++の1と0
それぞれm0sとn1sのドミネーターがあるとします。一方、バイナリ文字列の配列があります。ここでのタスクは、指定されたm0とn1で生成できる文字列の最大数を見つけることです。 0と1はそれぞれ最大1回使用できます。したがって、入力がArray =[“ 10”、“ 0001”、“ 111001”、“ 1”、“ 0”、]であり、m=5およびn=3の場合、出力は4になります。 「10」、「0001」、「1」、「0」である50と31を使用して、合計4つのストリングを形成できます。
これを解決するには、次の手順に従います-
- サイズ(m + 1)x(n + 1)の行列を作成します
- ret:=0
- 0からstrs配列のサイズまでの範囲のiの場合
- 1:=0、0:=0
- 範囲0からstrs[i]のサイズのjの場合
- star [i、j]が1の場合は1を増やし、0の場合は0を増やします
- mから0までの範囲のjの場合
- nから1までの範囲のjの場合
- dp [j、k]:=最大dp [j、k]および1 + dp [j –ゼロ、k-1]
- ret:=retとdp[j、k]の最大値
- nから1までの範囲のjの場合
- return ret
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector < vector <int> > dp(m + 1, vector <int>(n + 1));
int ret = 0;
for(int i = 0; i < strs.size(); i++){
int one = 0;
int zero = 0;
for(int j = 0; j < strs[i].size(); j++){
one += strs[i][j] == '1';
zero += strs[i][j] == '0';
}
for(int j = m; j>= zero; j--){
for(int k = n; k >= one; k--){
dp[j][k] = max(dp[j][k], 1 + dp[j - zero][k - one]);
ret = max(ret, dp[j][k]);
}
}
}
return ret;
}
};
main(){
vector<string> v = {"10","0001","111001","1","0"};
Solution ob;
cout << (ob.findMaxForm(v, 5, 3));
} 入力
["10","0001","111001","1","0"] 5 3
出力
4
-
C++で重複する円と長方形
(radius、xc、yc)として表される円があると仮定します。ここで、(xc、yc)は円の中心座標です。また、(x1、y1、x2、y2)として表される軸に沿った長方形があります。ここで、(x1、y1)は左下隅の座標であり、(x2、y2)は右上隅の座標です。長方形の角。円と長方形が重なっていないか確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 関数eval()を定義します。これには、a、b、c、が必要です。 bの最大値とaとcの最小値を返します メインの方法から、次のようにしま
-
C++でのDominoとTrominoのタイリング
ドミノとトロミノの2種類の形状があるとします。以下のように回転させることができます- タイリングでは、すべての正方形をタイルで覆う必要があります。ここで、2つのタイルは、ボード上に2つの4方向に隣接するセルがあり、タイルの1つだけが両方の正方形をタイルで占めている場合にのみ異なります。 Nが与えられた場合、2xNボードをタイリングできる方法をいくつ見つける必要がありますか?したがって、入力が3の場合、出力は5になります。したがって、配置は[XYZ XXZ XYYXXYXYY]と[XYZYYZXZZ XYY XXY]になります。ここでは、タイルごとに異なる文字が使用されます。 これを