leetcode 474. 一和零

image

本题仍是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];
    }
}
posted @ 2022-02-26 20:01  livingsu  阅读(36)  评论(0)    收藏  举报