Day46 dp1049,494,474

慢慢的,一点点的想,慢慢进行思考

1049. 最后一块石头的重量 II

此题虽是二刷,但仍有疑惑,依靠一句与416. 分割等和子集很像得以解题,思路如下:
        为了得到最后一块石头,剩余的石头会进行互相抵消,则我们可以dp得到抵消数的最大值,最后得到last石头的重量。转念一想,这也就是求容量为总石头重量中的一半,能装下最大价值

初始化数组:

dp = [0] * (m + 1)

遍历代码:

        for x in stones:
            if x > m:
                continue
            for i in range(m, x - 1, -1):
                dp[i] = max(dp[i], dp[i - x] + x)

494. 目标和 (未想出版)

未发现的点:已经sum和target的情况下,正负数已经固定

此时只需要得到正数出现的次数即可

初始化数组:

dp = [0] * (m + 1)

遍历代码:

        for x in stones:
            if x > m:
                continue
            for i in range(m, x - 1, -1):
                dp[i] = max(dp[i], dp[i - x] + x)

 

474.一和零

非常漂亮地解决,属于是二维的01背包,属于典型题

处理一下字符列表:

        for x in strs:
            zeros = 0
            ones = 0
            for y in x:
                if y == '1':
                    ones += 1
                else:
                    zeros += 1
            s.append([zeros, ones])

初始化数组:

dp = [[0] * (n + 1) for _ in range(m + 1)]

遍历代码:

        for x in s:
            if x[0] > m or x[1] > n:
                continue
            for i in range(m, x[0] - 1, -1):
                for j in range(n, x[1] - 1, -1):
                    dp[i][j] = max(dp[i][j], dp[i - x[0]][j - x[1]] + 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值