1.1 递归方程式
状态定义
设dp[i][j]表示从三角形顶部到达第i行第j列时,路径上数字之和的最优值。其中i的取值范围为0 ≤ i < n,j的取值范围为0 ≤ j ≤ i。
最优子结构与递归方程
到达第i行第j列的路径仅能从两个方向而来:
从第i-1行第j-1列移动到达;从第i-1行第j列移动到达。
递归方程式为:
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
边界条件
三角形顶部无前置路径,其最优值即为自身数字:dp[0][0] = triangle[0][0]。
此外,第i行的边界列仅有唯一前置路径:
当j=0时,只能从第i-1行第0列到达,即dp[i][0] = dp[i-1][0] + triangle[i][0];
当j=i时,只能从第i-1行第i-1列到达,即dp[i][i] = dp[i-1][i-1] + triangle[i][i]。
1.2 填表法核心信息
表的维度
采用二维表格dp存储状态,维度为n × n。实际有效存储范围为第i行第0至i列,其余列(j > i)无需使用。
填表范围
行范围:从第1行到第n-1行(因为第0行已由边界条件确定);
列范围:第i行的列从0到i,覆盖该行所有有效数字。
填表顺序
采用自上而下的顺序填表。因为计算dp[i][j]时,必须依赖上一行(i-1行)的dp[i-1][j-1]和dp[i-1][j],需确保上一行的相关状态已计算完成。
原问题的最优值
原问题的最优值是底部行所有状态中的最大值。因为底部行的每个位置都是可能的终点,最优路径的终点必然是其中之一。
1.3 算法复杂度分析
时间复杂度
填表过程中,每个有效状态dp[i][j]仅需计算一次。因此,时间复杂度为O(n²),n为数字三角形的行数。
空间复杂度
使用n×n的二维数组存储所有状态,空间复杂度为O(n²);
二、对动态规划算法的理解和体会
动态规划是一种分治思想的延伸,核心是通过“分解子问题、利用最优子结构、存储重叠子问题结果”来避免重复计算,提高效率。与分治法不同,动态规划处理的子问题存在大量重叠,且子问题的最优解能推导原问题的最优解。
解题思路
- 定义状态:将原问题转化为可量化的状态,这是解题的核心,状态定义不当会导致后续推导困难;
- 推导递归方程:基于最优子结构,建立状态之间的递推关系,明确“当前状态如何由之前的状态得到”;
- 确定边界条件:明确递推的起点,避免无限递归或状态计算错误;
- 确定填表顺序:确保计算当前状态时,所需的前置状态已全部计算完成;
- 求解原问题:从最终的状态集合中找到原问题的答案。