【力扣刷题 | 第二十五天】

目录

前言:

  474. 一和零 - 力扣(LeetCode)

总结:


前言:

        今天我们依旧暴打动态规划

  474. 一和零 - 力扣(LeetCode)

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

其实这也是一个背包问题,只不过以前我们的限制条件只有一个重量,现在变成了两个,一个是,m,一个是n。那么我们就可以抽象的看他为一个二维的01背包问题。

那么我们就按照动态规划五部曲走:

1.确定dp数组的含义及其下标方式:dp[i][j] 表示装满 i 个0 和 j 个1 的背包中的最大子集长度

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
            vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); 
        for (string str : strs) { 
            int one = 0, zero = 0;
            for (char c : str) {
                if (c == '0') zero++;
                else one++;
            }
            for (int i = m; i >= zero; i--)
             { 
                for (int j = n; j >= one; j--) 
                {
                    dp[i][j] = max(dp[i][j], dp[i - zero][j - one] + 1);
                }
            }
        }
        return dp[m][n];
    }
    
};

总结:

                动态规划很难一眼看出来就是背包问题,要仔细甄别

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

猜你喜欢

转载自blog.csdn.net/fckbb/article/details/132178613
今日推荐