一和零 (Ones and Zeroes)

 

思路:动态规划:子集个数可以理解为价值,每个字符串价值为1,这样子就是最大价值。

// @Title: 一和零 (Ones and Zeroes)
// @Author: qisiii
// @Date: 2024-09-27 00:39:36
// @Runtime: 18 ms
// @Memory: 40.9 MB
// @comment: 动态规划:子集个数可以理解为价值,每个字符串价值为1,这样子就是最大价值。
// @flag: GREEN
class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        //dp[i][j]中刚好满足i个0和j个1
        int[][] dp=new int[m+1][n+1];
        //这层循环可以理解为物品
        for(String str:strs){
            int zeroNum=0,oneNum=0;
            for(char c:str.toCharArray()){
                if(c=='0'){
                    zeroNum++;
                }else{
                    oneNum++;
                }
            }
            //0和1的数量可以理解为重量
            //这里之所以倒序是因为当选择了当前元素i,额外计算的是i-1个的情况,可以理解为前一张二维表的状况,也就是str(i-1)对应的dp表
            for(int i=m;i>=zeroNum;i--){
                for(int j=n;j>=oneNum;j--){
            // for(int i=zeroNum;i<=m;i++){
            //     for(int j=oneNum;j<=n;j++){
                    dp[i][j]=Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);
                }
            }
        }
        return dp[m][n];
    }
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2024-10-18