写对动态规划?从这句代码开始!

64 阅读1分钟

直接写 dp[0] = nums[0]

今天我们来讲清楚这个高频但容易忽视的关键点。


🎯 核心思想

如果 dp[i] 的定义是:以 i 为结尾的某种最优子结构(如子数组、子序列、路径) ,那么:

dp[0] = nums[0] 是最自然、也是最合理的 base case。


📌 例题分析

1️⃣ 最大子数组和

dp[i] = 以 nums[i] 结尾的最大子数组和
dp[0] = nums[0]
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);

2️⃣ 最长连续 1(本文开头的问题)

dp[i] = 以 i 结尾的最长连续 1 的长度
dp[0] = nums[0]
dp[i] = (nums[i] == 1) ? dp[i-1] + 1 : 0

3️⃣ House Robber

dp[i] = 抢前 i 个房子的最大金额
dp[0] = nums[0]

✅ 通用模板

只要你看到这样的定义:

“以 index i 结尾的最大/最小/最长/最优 …”

就可以考虑:

dp[0] = nums[0]; // 如果 nums[0] 本身就构成合法状态

✨ 小结

dp[0] = nums[0] 源于“以 i 结尾”的定义逻辑!

掌握这个小技巧,不仅能帮助你初始化写对,还能让你对状态定义理解更深一层。