直接写 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 结尾”的定义逻辑!
掌握这个小技巧,不仅能帮助你初始化写对,还能让你对状态定义理解更深一层。