解题步骤:
参考代码:
未优化代码:
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
//开一个三维的dp表
vector<vector<vector<int>>> dp(strs.size()+1,vector<vector<int>>(m+1,vector<int>(n+1)));
//无需初始化
//填表
for(int i=1;i<=strs.size();i++)
{
//x代表strs[i]中字符0的个数
//y代表strs[i]中字符1的个数
int x=0;
int y=0;
for(const auto& ch:strs[i-1])
{
if(ch=='0')
{
x+=1;
}
else if(ch=='1')
{
y+=1;
}
}
//注意这里要从0开始,因为我们没有初始化
for(int j=0;j<=m;j++)
{
//注意这里要从0开始,因为我们没有初始化
for(int k=0;k<=n;k++)
{
//状态转移方程
dp[i][j][k]=dp[i-1][j][k];
if(j>=x&&k>=y)
{
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-x][k-y]+1);
}
}
}
}
//返回值
return dp[strs.size()][m][n];
}
};
优化后的代码:
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
//开一个二维dp表即可
vector<vector<int>> dp(m+1,vector<int>(n+1));
//无需初始化
//填表
for(int i=1;i<=strs.size();i++)
{
//x代表strs[i]中字符0的个数
//y代表strs[i]中字符1的个数
int x=0;
int y=0;
for(const auto& ch:strs[i-1])
{
if(ch=='0')
{
x+=1;
}
else if(ch=='1')
{
y+=1;
}
}
//记得要从大到小遍历
for(int j=m;j>=x;j--)
{
//记得要从大到小遍历
for(int k=n;k>=y;k--)
{
dp[j][k]=max(dp[j][k],dp[j-x][k-y]+1);
}
}
}
//返回值
return dp[m][n];
}
};
你学会了吗???