【代码随想录训练营】【Day 45】【动态规划-5】| Leetcode 1049, 494, 474

【代码随想录训练营】【Day 45】【动态规划-5】| Leetcode 1049, 494, 474

需强化知识点

题目

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

  • 代码随想录思路:尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了
  • 为什么两两单个相撞可以等效于两个group相撞:先分成两个数值相近的group,每个group里的元素分别相撞,就等效于两组group都同时减去一个小的值,这样分别减下去就会把较小的元素都消掉,每个group就只剩一个元素了,这样不就"归"成了两个group相撞了吗? 结论:持续进行两两单个相撞【最终】会导致两两group相撞
python 复制代码
class Solution:
    def lastStoneWeightII(self, stones: List[int]) -> int:
        target = sum(stones) // 2
        # dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。
        dp = [0] * (target+1)

        for i in range(len(stones)):
            for j in range(target, stones[i]-1, -1):
                dp[j] = max(dp[j], dp[j-stones[i]] + stones[i])
        
        return abs(dp[target] - (sum(stones)- dp[target]))

494. 目标和

  • 注意 提前终止条件 以及 dp_target 的推导
    • left - right = target,left - (sum-left) = target
python 复制代码
class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        dp_target = (sum(nums) + target) // 2
        # dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法
        # 因为从 dp[0] 开始累加,所以初始值应为1
        if (sum(nums) + target) % 2 or abs(target) > sum(nums):
            return 0
        dp = [0] * (dp_target + 1)
        dp[0] = 1

        for num in nums:
            for i in range(dp_target, num-1, -1):
                dp[i] += dp[i - num]
                
        return dp[dp_target]

474. 一和零

python 复制代码
class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        dp = [[0] * (n+1) for _ in range(m+1)]
        
        for num in strs:
            zero_num, one_num = 0, 0
            for c in num:
                if c == "0":
                    zero_num += 1
                else:
                    one_num += 1
            
            for i in range(m, zero_num-1, -1):
                for j in range(n, one_num-1, -1):
                    dp[i][j] = max(dp[i][j], dp[i-zero_num][j-one_num]+1)
            
        return dp[m][n]         
相关推荐
weixin_307779133 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
hetao17338379 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6269 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan10 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_9603563811 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah11 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO911 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician11 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.11 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o12 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法