本文最后更新于601 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
视频讲解:https://www.bilibili.com/video/BV1rW4y1x7ZQ
https://programmercarl.com/0474.%E4%B8%80%E5%92%8C%E9%9B%B6.html
1.当我看到这个题的时候我还真的想到了用二维数组了,因为本题有两个需要检测的条件就是0 和 1的检测,所以本题使用二维数组但不是前面几道题的二维数组的解题方案,这个题更像是三维数组给压成了一个二位数组,本题的dp数组的含义是dp[i][j]是i个0 j个1 的这个元素的最大装几个物品(也就是数)我觉得这个动态规划之所以难是当这个题出现的时候我先入为主没有靠近这个01背包问题,当我意识到这个是01背包问题的时候我脑子里已经带上其他的想法,以本题举例,我就已经想着先判断这个数的一些性质去了,而不是想着将这些数每一个数当做一个物品来放在背包里了,这个思路要转换一会,而且,每一个递归公式虽然都是差不多一样的但是每次我都要多考虑一下,想一想这是个一维(二维)滚动数组,考虑这个数组的一些问题。
CPP
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 x = 0;
int y = 0;
for(char c : str){
if(c == '0')x++;
else y++;
}
for(int i = m; i >= x; i--){
for(int j = n; j >= y; j--){
dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);
}
}
}
return dp[m][n];
}
};