一和零
Leetcode 474
学习记录自代码随想录
要点:1.背包容量为二维,物品重量为数组元素长度,价值为1;
2.仍是01背包问题,递推公式仿照 d p [ j ] = m a x ( d p [ j ] , d p [ j − w e i g h t [ i ] ] + v a l u e [ i ] ) dp[j] = max(dp[j], dp[j-weight[i]]+value[i]) dp[j]=max(dp[j],dp[j−weight[i]]+value[i])得到 d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − z e r o _ n u m ] [ j − o n e _ n u m ] + 1 ) dp[i][j] = max(dp[i][j], dp[i-zero\_num][j-one\_num]+1) dp[i][j]=max(dp[i][j],dp[i−zero_num][j−one_num]+1)
3.数组初始化也仿照01背包问题,没有负数则数组值初始化为0
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {// 1.dp[i][j]含义:最多有i个0,j个1时的最大子集长度为dp[i][j]vector<vector<int>> dp(m+1, vector<int>(n+1, 0));// 2.递推公式dp[i][j] = max(dp[i][j], dp[i-zero_num][j-one_num]+1)物品重量为其zero_num和one_num,价值为1// 3.dp数组初始化和01背包问题一样为0// 4.遍历顺序外层遍历物品,内层反向遍历容量for(int str = 0; str < strs.size(); str++){int zero_num = 0, one_num = 0;for(char a : strs[str]){if(a == '0') zero_num++;else one_num++;}for(int i = m; i >= zero_num; i--){for(int j = n; j >= one_num; j--){dp[i][j] = max(dp[i][j], dp[i-zero_num][j-one_num] + 1);}}}// 5.举例推导dp数组return dp[m][n];}
};