动态规划五部曲:
1、确定dp数组及其下标含义
dp[i][j]意为最多有i个0和j个1的strs的最大子集的元素个数
2、确定dp数组递推式
//可由i、j、当前元素0和1的个数推导
dp[i][j] = max(dp[i][j],dp[i-ZeroNumber][j-oneNumber]+1);
3、如何初始化
数组初始化为0
4、确定遍历顺序
从后往前
5、举例推导dp数组 m=3 n = 3
题解:
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
//dp数组含义 该题分0和1的个数 应该采用二维数组
//dp[i][j]意为最多有i个0和j个1的strs的最大子集的元素个数
//则dp[i][j]可由前一个元素的0和1的个数来推导
//定义dp数组
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
//遍历物品
for(string str:strs){
//当前元素0和1的个数
int oneNumber = 0;
int ZeroNumber = 0;
//计算这两个数的值
for(char c:str){
if(c =='0'){
ZeroNumber++;
}else{
oneNumber++;
}
}
//计算dp
for(int i = m;i>=ZeroNumber;i--){
for(int j = n;j>=oneNumber;j--){
//更新dp值
dp[i][j] = max(dp[i][j],dp[i-ZeroNumber][j-oneNumber]+1);
}
}
}
return dp[m][n];
}
};