C ++中的一劳永逸
假设我们有一个分别为m0s和n1s的支配者。另一方面,有一个带有二进制字符串的数组。现在我们的任务是找到在给定的m0和n1的情况下可以生成的最大字符串数。0和1最多只能使用一次。因此,如果输入类似于Array=[“10”,“0001”,“111001”,“1”,“0”,]且m=5且n=3,则输出将为4。这是因为通过使用50和31可以形成总共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