leetcode474.一和零

44 阅读1分钟

image.png

思路:抽象成背包问题。本题中strs 数组里的元素就是物品,每个物品都是一个。而m 和 n相当于是一个背包,两个维度的背包

dp数组

dp[i][j]:容量为i的背包最多几个0,,容量为j的背包最多几个1.

1.  1.  str["10","0001","111001","1","0"],m=5,n=3

此时元素是10,有1个1和1个0. image.png 此时有3个0和1个1.

除去3个0和1个1后的背包还有多少空间?

dp[i-zeros][j-ones]=dp[5-3][3-1]=dp[2][2]=1,最多可以放1个。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

递归公式
dp[i][j]=Math.max(dp[i-zeros][j-ones]+1,dp[i][j])  
class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int[][] dp=new int[m+1][n+1];
        for(String s:strs){
            int zeros=0;
            int ones=0;
            //统计0和1的值
            for(char c:s.toCharArray()){
                if(c=='0'){
                    zeros++;
                }else{
                    ones++;
                }
            }
            //更新dp数组
            for(int i= m;i>=zeros;i--){
                for(int j=n;j>=ones;j--){
                    dp[i][j]=Math.max(dp[i-zeros][j-ones]+1, dp[i][j]);
                }
            }

        }
        return dp[m][n];
    }
}