动态规划刷题总结
1 打家劫舍系列 1.1 主线 三题共享同一个决策:当前这个位置,选还是不选 选了,就必须跳过与它相邻的位置 不选,就继承邻居的最优解 区别只在"相邻"的拓扑长什么样: 题 相邻结构 处理办法 198 一条链 直接线性 DP 213 一个环 拆成两条链各做一次 198 337 一棵树 后序遍历,每个节点向上返回一对值 1.2 打家劫舍 状态定义: dp[i] = 考虑区间 [0, i] 的房间时,能偷到的最大金额 注意"考虑"两个字 定义是"前 i 间里随便选",不是"必须偷第 i 间"。所以答案直接是 dp[n-1],不需要打擂台。这跟后面 300/718 那种"必须以 i 结尾"的定义正好是一对反例,可以拿来对照记。 状态转移: 偷第 i 间: dp[i] = nums[i] + dp[i-2] 不偷第 i 间: dp[i] = dp[i-1] dp[i] = max(dp[i-1], nums[i] + dp[i-2]) 初始化: dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) 代码(滚动数组): ...