@@ -2812,6 +2829,7 @@ dp[i] = dp[i-1] + dp[i-2]
dp[i] = \min(dp[i-1], dp[i-2]) + cost[i]
\]
这便可以引出「最优子结构」的含义:原问题的最优解是从子问题的最优解构建得来的。对于本题,我们从两个子问题最优解 \(dp[i-1]\) , \(dp[i-2]\) 中挑选出较优的那一个,并用它构建出原问题 \(dp[i]\) 的最优解。
+
相较于分治算法问题,动态规划问题的解也是由其子问题的解构成的。不同的是,动态规划中子问题的解不仅揭示了问题的局部最优解,而且还通过特定的递推关系链接起来,共同构建出原问题的全局最优解。
那么,上道爬楼梯题目有没有最优子结构呢?它要求解的是方案数量,看似是一个计数问题,但如果换一种问法:求解最大方案数量。我们惊喜地发现,虽然题目修改前后是等价的,但最优子结构浮现出来了:第 \(n\) 阶最大方案数量等于第 \(n-1\) 阶和第 \(n-2\) 阶最大方案数量之和。所以说,最优子结构的是一个比较宽泛的概念,在不同问题中会有不同的含义。
根据以上状态转移方程,以及初始状态 \(dp[1] = cost[1]\) , \(dp[2] = cost[2]\) ,我们可以得出动态规划解题代码。