• [LeetCode] 474. 一和零


    1. 一和零

    把总共的 0 和 1 的个数视为背包的容量,每一个字符串视为装进背包的物品。这道题就可以使用 0-1 背包问题的思路完成,这里的目标值是能放进背包的字符串的数量。

    动态规划的思路是:物品一个一个尝试,容量一点一点尝试,每个物品分类讨论的标准是:选与不选。

    定义状态:尝试题目问啥,就把啥定义成状态。dp[i][j][k] 表示输入字符串在子区间 [0, i] 能够使用 j 个 0 和 k 个 1 的字符串的最大数量。

    状态转移方程:

    dp[i][j][k]=left{
    egin{aligned}
    dp[i-1][j][k],
    dp[i-1][j-count0][k-count1]
    end{aligned}
    ight.

    初始化:为了避免分类讨论,通常多设置一行。这里可以认为,第 00 个字符串是空串。第 00 行默认初始化为 00。 输出:输出是最后一个状态,即:dp[i][j][k]

    class Solution {
        public int findMaxForm(String[] strs, int m, int n) {
            int len = strs.length;
            int[][][] f= new int[len+1][m+1][n+1];
            for (int i=1;i<=len;i++) {
                String s = strs[i-1];
                int p = 0;
                int q = 0;
                for (int k = 0;k<s.length();k++) {
                    if (s.charAt(k) == '0') {
                        p++;
                    } else {
                        q++;
                    }
                }
    
                for (int a=0;a<=m;a++) {
                    for (int b=0;b<=n;b++) {
                        f[i][a][b] = f[i-1][a][b];
                        if (a>=p&&b>=q) {
                            f[i][a][b] = Math.max(f[i-1][a][b], f[i-1][a-p][b-q]+1);
                        }
                    }
                }
            }
    
            return f[len][m][n];
        }
    }
    
  • 相关阅读:
    [bzoj1613 Usaco2007 Jan]Running贝茜的晨练计划
    [bzoj1600][Usaco2008 Oct]建造栅栏
    [bzoj3208]花神的秒题计划I
    [vijos1011]滑雪
    [noip2007 pjt3] 守望者的逃离
    DP(1) 背包
    快速幂 模板及应用
    BZOJ1303: [CQOI2009]中位数图
    BZOJ1083: [SCOI2005]繁忙的都市
    Bzoj1084: [SCOI2005]最大子矩阵
  • 原文地址:https://www.cnblogs.com/acbingo/p/14855086.html
Copyright © 2020-2023  润新知