leetcode-master/problems/0474.一和零.md

1.3 KiB
Raw Blame History

// 即使做了很多动态规划的题目,做这个依然懵逼 // 这道题目有点 程序员自己给自己出难进急转弯的意思 // 该子集中 最多 有 m 个 0 和 n 个 1 。 指的是整体子集 // 这是二维背包,多重背包 // dp[i][j] 有i个0j个1最大有多少个子集但是遍历的时候 顶部是哪里呢?

搞不懂 leetcode后台是什么牛逼的编译器初始化int dp[101][101] = {0}; 可以 int dp[101][101];就不行,有其他默认值,坑死。 代码我做了实验后台会拿findMaxForm运行两次取第二次的结果dp有上次记录的数值。

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        int dp[101][101] = {0}; // 默认初始化0
        for (int i = 0; i < strs.size(); i++) {
            int oneNum = 0, zeroNum = 0;
            for (char c : strs[i]) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            // 果然还是从后向前模拟01背包
            for (int j = m; j >= zeroNum; j--) {
                for (int k = n; k >= oneNum; k--) {
                    dp[j][k] = max(dp[j][k], dp[j - zeroNum][k - oneNum] + 1);
                }
            }
        }
        return dp[m][n];
    }
};