【leetcode题解-动态规划之0-1背包】474. 一和零(python版本+详细表格计算)

【leetcode题解-动态规划之0-1背包】474. 一和零(python版本+详细表格计算),第1张

474. 一和零

本题为0-1背包,因为物品(strs中每一个字符串)只能使用一次,但是背包有两个:m,n分别表示最多装m个0和n个1的两个背包

即:weight维度为2(对应0,1的个数),每个字符串value为1,背包分别为容量为m和n的0背包和1背包

dp五部曲:

1. dp[i][j]:最多有i个0和j个1的字符串数组最大子集长度

2. 递推公式:dp[i][j]=max(dp[i][j],dp[i-sum0][j-sum1]+1)

sum0,sum1:当前字符串k所包含的0,1个数

dp[i][j]:不选择字符串k,则从0~k中进行选择的结果等于从0~k-1中选择的dp[i][j]

dp[i][j]:选择字符串k,则从0~k中进行选择的结果等于从0~k-1中选择的dp[i-sum0][j-sum1](dp两个维度都减去当前字符串k的0,1个数)+1(当前字符串)

3. 初始化

dp全部初始化为0

4. 遍历方向

从右下角开始,从右到左,从下到上(保证不覆盖)

5. 举例推导

以输入:["10","0001","111001","1","0"],m = 3,n = 3为例

k=0

strs[k]="10" sum0=1 sum1=1

重点:从右下角开始,从右到左,从下到上(保证不覆盖)

dpj=0j=1j=2j=3
i=00000
i=10111
i=20111
i=30111

k=1

strs[k]="0001" sum0=3 sum1=1

dpj=0j=1j=2j=3
i=00000
i=10111
i=20111
i=30111

k=2

strs[k]="111001" sum0=2 sum1=4

dpj=0j=1j=2j=3
i=00000
i=10111
i=20111
i=30111

k=3

strs[k]="1" sum0=0 sum1=1

dpj=0j=1j=2j=3
i=00111
i=10122
i=20122
i=30122

k=4

strs[k]="0" sum0=1 sum1=0

dpj=0j=1j=2j=3
i=00111
i=11222
i=21233
i=31233

最终得到dp[3][3]=3为所求

python代码:

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        lens=len(strs)
        dp=[[0]*(n+1) for _ in range(m+1)]
        for s in strs:
            sum0=s.count('0')
            sum1=s.count('1')
            for i in range(m,sum0-1,-1):
                for j in range(n,sum1-1,-1):
                    dp[i][j]=max(dp[i][j],dp[i-sum0][j-sum1]+1)
        return dp[m][n]

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/786621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存