假设我们有一个分别为m 0s和n 1s的支配者。另一方面,有一个带有二进制字符串的数组。现在我们的任务是找到在给定的m 0和n 1的情况下可以生成的最大字符串数。0和1最多只能使用一次。因此,如果输入类似于Array = [“ 10”,“ 0001”,“ 111001”,“ 1”,“ 0”,]且m = 5且n = 3,则输出将为4。这是因为通过使用5 0和3 1可以形成总共4个字符串,即“ 10”,“ 0001”,“ 1”,“ 0”。
为了解决这个问题,我们将遵循以下步骤-
制作一个大小为(m + 1)x(n + 1)的矩阵
ret:= 0
对于范围在0到strs数组大小的i
对于范围n中的j降至1
dp [j,k]:= dp [j,k]的最大值和1 + dp [j –零,k-一个]
ret:= ret和dp [j,k]的最大值
当star [i,j]为1时加1,或为0时加0
一:= 0,零:= 0
对于范围从0到strs [i]的j
对于范围m到0的j
返回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