你的总结非常接近核心逻辑,但可以再补充一些细节和边界情况,让这个结论更严谨。
对于大部分线性 DP 问题(比如打家劫舍、0-1 背包、最长上升子序列等),回溯方案的核心确实是:
但要注意几个关键前提和例外情况:
一、 这个规律成立的核心条件
线性 DP 的状态 dp[i] 通常对应两种选择:
状态转移的来源是确定的
二、 需要注意的例外和细节
有些线性 DP 的 dp[i] 可能有多个转移来源,这时不能只看和上一项是否相等。比如 完全背包:dp[j] = max(dp[j], dp[j-w[i]] + v[i])
回溯时,dp[j] 可能来自任意一个满足 j>=w[i] 且 dp[j] = dp[j-w[i]]+v[i] 的物品 i,这时需要遍历所有物品找来源,而不是只和 j-1 比较。
收益可为负的情况
比如我们刚做的星灯题,dp[i] 会取 max(dp[i-1], dp[i-2]+a[i]),但如果 a[i] 是负数,dp[i-2]+a[i] 可能小于 dp[i-1],这时必然不选 i。
这种情况依然符合「变化则选」的规律,但要注意 dp 初始化时要考虑「不选任何项」的收益(比如星灯题的 dp[1] = max(0, a[1]))。
非「选 / 不选」类的线性 DP
三、 最终结论
可以修正为更严谨的表述: