class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
for(int i = 1;i <= strs.length;i++){
String str = strs[i - 1];
int one = 0;
int zero = 0;
for(int k = 0;k < str.length();k++){
if(str.charAt(k) == '1') one++;
if(str.charAt(k) == '0') zero++;
}
for(int j = m; j >= zero;j--){
for(int k = n;k >= one;k--){
dp[j][k] = Math.max(dp[j - zero][k - one] + 1,dp[j][k]);
}
}
}
return dp[m][n];
}
}
绝了,巨坑这题,二维的0-1背包问题,dp[i][j]意味着i个0,j个1情况下能容纳的最大子集,
动规递推式中加入Math.max是为了防止出现符合情况的子串,但是dp[j - zero][k - one]比dp[j][k]小2甚至3的情况,即一个符合条件的子串包含的01数量大于等于之前上个符合情况的子串集合两个之和。