题目:
代码(首刷看解析 2024年2月26日)
class Solution {
public:
// 二维 0 1背包
int findMaxForm(vector<string>& strs, int m, int n) {
// 1 二维 [i]表示 0 的个数,上限m; [j]表示 1 的个数,上限n
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// 2 初始化 TODO:
dp[0][0] = 0;
// 3 遍历 TODO:倒序遍历[i][j]
for (auto str : strs) {
int zeroNum = 0;
int oneNum = 0;
for (int it : str) {
if (it == '0') zeroNum++;
else if(it == '1')oneNum++;
}
cout<<"zero:"<<zeroNum<<" one:"<<oneNum<<endl;
for (int i = m; i >= zeroNum; --i) {
for (int j = n; j >= oneNum; --j) {
dp[i][j] = max(dp[i][j],
dp[i - zeroNum][j - oneNum] + 1);
cout<<"dp["<<i<<"]"<<"["<<j<<"]:"<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<"___________________________________"<<endl;
}
return dp[m][n];
// 4 递推公式 dp[i][j] = max(dp[i - zeroNum][j - oneNum],
// dp[i - zeroNum][j - oneNum] + 1);
}
};