zoukankan      html  css  js  c++  java
  • 刷题-力扣-474. 一和零

    474. 一和零

    题目链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/ones-and-zeroes/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目描述

    给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
    请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
    如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

    示例 1:

    输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
    输出:4
    解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
    其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
    

    示例 2:

    输入:strs = ["10", "0", "1"], m = 1, n = 1
    输出:2
    解释:最大的子集是 {"0", "1"} ,所以答案是 2 。
    

    提示:

    • 1 <= strs.length <= 600
    • 1 <= strs[i].length <= 100
    • strs[i] 仅由 '0' 和 '1' 组成
    • 1 <= m, n <= 100

    题目分析

    1. 根据题目描述求最多包含m个0和n个1的最大子集
    2. 使用动态规划求解,和经典0/1背包问题类似,只是约束条件由背包大小变成了m个0和n个1
    3. dp[i][j][k]表示j个0和k个1包含前i个元素的最大子集个数
    4. 状态转移方程,
      当j>=zeroSum,k>=oneSum时,dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-zeroSum][k-oneSum]+1),zeroSum表示strs[i-1]中0的个数;oneSum表示strs[i-1]中1的个数
      其他,dp[i][j][k]=dp[i-1][j][k]
    5. 边界条件,当i=0时,dp[i][j][k]=0

    代码

    class Solution {
    public:
        int findMaxForm(vector<string>& strs, int m, int n) {
            int strsLen = strs.size();
            vector<vector<vector<int>>> dp(strsLen + 1, vector<vector<int>>(m + 1, vector<int>(n + 1, 0)));
            for (int i = 1; i <= strsLen; ++i) {
                int zeroSum = 0;
                int oneSum = 0;
                for (auto s : strs[i - 1]) {
                    if (s == '0') ++zeroSum;
                    else ++oneSum;
                }
                for (int j = 0; j <= m; ++j) {
                    for (int k = 0; k <= n; ++k) {
                        if (j >= zeroSum && k >= oneSum) dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - zeroSum][k - oneSum] + 1);
                        else dp[i][j][k] = dp[i - 1][j][k];
                    }
                }
            }
            return dp[strsLen][m][n];
        }
    };
    
  • 相关阅读:
    < java.util >-- Set接口
    Codeforces 627 A. XOR Equation (数学)
    Codeforces 161 B. Discounts (贪心)
    Codeforces 161 D. Distance in Tree (树dp)
    HDU 5534 Partial Tree (完全背包变形)
    HDU 5927 Auxiliary Set (dfs)
    Codeforces 27E. Number With The Given Amount Of Divisors (暴力)
    lght oj 1257
    Codeforces 219D. Choosing Capital for Treeland (树dp)
    Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
  • 原文地址:https://www.cnblogs.com/HanYG/p/14858791.html
Copyright © 2011-2022 走看看