思路:首先分析题目,要注意到m个0,n个1,而且每个01 只能使用一次,所以联系01背包问题;
由于有m个0,n个1;所以状态空间为m*n的矩阵,dp[m][n] 代表的含义就是m个0,n个1的条件下,最多能满足的字符串个数,
还有一点要注意的,我们不能顺序的循环状态,因为会发生覆盖问题,所以循环仿方面采用倒序
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int dp[][] = new int[m + 1][n + 1];
for(String s : strs)
{
int c1 = 0;
int c0 = 0;
for(char i : s.toCharArray())
{
if(i == '1')
{
c1 ++;
}
else
{
c0 ++;
}
}
for(int a = m ; a >= c0; a --)
{
for(int b = n; b >= c1; b-- )
{
dp[a][b] = Math.max(dp[a][b], dp[a - c0][b- c1] + 1);
//状态转移解释,dp[a][b] 等于 dp[a][b]当前 或是 除去该字符串个数的位置个数+1
}
}
}
return dp[m][n];
}
}