C ++中的一劳永逸

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