假设我们有一个分别为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