leetcode 474. 一和零

本题仍是0-1背包问题,只不过背包的容量限制从一维变成了两维。
dp[i][j]: 最多有i个0和j个1的最大子集的长度
转移方程:
dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)
zeroNum,oneNum是当前遍历到的字符串中0和1的数量
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp=new int[m+1][n+1];
for(int i=0;i<strs.length;i++){
String str=strs[i];
int zeroNum=0,oneNum=0;
for(int t=0;t<str.length();t++){
if(str.charAt(t)=='0') zeroNum++;
else oneNum++;
}
for(int j=m;j>=zeroNum;j--){
for(int k=n;k>=oneNum;k--){
dp[j][k]=Math.max(dp[j][k],dp[j-zeroNum][k-oneNum]+1);
}
}
}
return dp[m][n];
}
}

浙公网安备 33010602011771号