leetcode 474 一和零

思路:首先分析题目,要注意到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];

    }
}

 

你可能感兴趣的:(leetcode 474 一和零)