zoukankan      html  css  js  c++  java
  • 474. 一和零

    这道题和经典的背包问题非常相似,但是和经典的背包问题只有一种容量不同,这道题有两种容量,即选取的字符串子集中的 (0)(1) 的数量上限。

    定义三维数组 ( extit{dp}),其中 ( extit{dp}[i][j][k]) 表示在前 (i) 个字符串中,使用 (j)(0)(k)(1) 的情况下最多可以得到的字符串数量。假设数组 ( extit{str}) 的长度为 (l),则最终答案为 ( extit{dp}[l][m][n])

    当没有任何字符串可以使用时,可以得到的字符串数量只能是 (0),因此动态规划的边界条件是:当 (i=0) 时,对任意 (0 le j le m)(0 le k le n),都有 ( extit{dp}[i][j][k]=0)

    (1 le i le l) 时,对于 ( extit{strs}) 中的第 (i) 个字符串(计数从 (1) 开始),首先遍历该字符串得到其中的 (0)(1) 的数量,分别记为 ( extit{zeros})( extit{ones}),然后对于 (0 le j le m)(0 le k le n),计算 ( extit{dp}[i][j][k]) 的值。

    (0)(1) 的容量分别是 (j)(k) 时,考虑以下两种情况:

    如果 (j < extit{zeros})(k < extit{ones}),则不能选第 (i) 个字符串,此时有 ( extit{dp}[i][j][k] = extit{dp}[i - 1][j][k])

    如果 (j ge extit{zeros})(k ge extit{ones}),则如果不选第 (i) 个字符串,有 ( extit{dp}[i][j][k] = extit{dp}[i - 1][j][k]),如果选第 (i) 个字符串,有 ( extit{dp}[i][j][k] = extit{dp}[i - 1][j - extit{zeros}][k - extit{ones}] + 1)( extit{dp}[i][j][k])的值应取上面两项中的最大值。

    因此状态转移方程如下:

    [ extit{dp}[i][j][k]=egin{cases} extit{dp}[i - 1][j][k], & j< extit{zeros} ~~ | ~~ k< extit{ones} \ max( extit{dp}[i - 1][j][k], extit{dp}[i - 1][j - extit{zeros}][k - extit{ones}] + 1), & j ge extit{zeros} ~ & ~ k ge extit{ones} end{cases} ]

    最终得到 ( extit{dp}[l][m][n]) 的值即为答案。

    class Solution {
    public:
        int findMaxForm(vector<string>& strs, int m, int n) {
            int len = strs.size();
            vector<vector<int>> f(m + 1, vector<int>(n + 1));
            for(int i = 0; i < len; i++)
            {
                int cnt0 = 0, cnt1 = 0;
                string str = strs[i];
                for(auto& t : str)
                    if(t == '0') cnt0++;
                    else cnt1++;
    
                for(int j = m; j >= cnt0; j--)
                    for(int k = n; k >= cnt1; k--)
                        f[j][k] = max(f[j][k], f[j - cnt0][k - cnt1] + 1);
            }
            return f[m][n];
        }
    };
    
  • 相关阅读:
    【简●解】[AHOI2009]中国象棋
    【讲●解】KMP算法
    【简●解】POJ 1185,LG P2704【炮兵阵地】
    学习网站整理
    【讲●解】火车进出栈类问题 & 卡特兰数应用
    洛谷4556 [Vani有约会]雨天的尾巴
    BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations
    洛谷1119 灾后重建
    洛谷1462(重题1951) 通往奥格瑞玛的道路(收费站_NOI导刊2009提高(2))
    BZOJ2721或洛谷1445 [Violet]樱花
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14940013.html
Copyright © 2011-2022 走看看