第二周作业
1.1 递归方程式
第一步:
设数字三角形有 n 行,用二维数组 a[i][j] 表示第 i 行第 j 列的数字(i、j 均从 1 开始计数,避免边界判断复杂)。定义 dp[i][j] 为从顶点(第 1 行第 1 列)到第 i 行第 j 列的路径上,数字之和的最大值。
第二步递归方程式(最优子结构)
要到达 (i,j),只能从上方的 (i-1,j-1) 或正上方的 (i-1,j) 过来,因此取两者的最大值加上当前数字:dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + a[i][j]
第三步:
第 1 行只有 1 个元素,路径唯一:dp[1][1] = a[1][1]
第 i 行的第 1 列(最左侧),只能从上方 (i-1,1) 过来:dp[i][1] = dp[i-1][1] + a[i][1]
第 i 行的第 i 列(最右侧),只能从上方 (i-1,i-1) 过来:dp[i][i] = dp[i-1][i-1] + a[i][i]
1.2 填表法细节
表的维度
二维表格 dp[n][n](n 为数字三角形的行数),与原三角形维度一致。
填表范围
二维版本:i 从 2 到 n(第 1 行已由边界条件确定),j 从 1 到 i(第 i 行有 i 个元素)。
一维版本:i 从 2 到 n,j 从 i 到 1(逆序填表,避免覆盖前一行未使用的状态)。
填表顺序
二维版本:从上到下、从左到右。先填第 2 行,再填第 3 行…… 直到第 n 行;每行内从第 1 列填到第 i 列。
原问题的最优值
第 n 行的所有 dp[n][j](j 从 1 到 n)中最大的那个,即 max(dp[n][1], dp[n][2], ..., dp[n][n])
1.3 时间和空间复杂度分析
时间复杂度
时间复杂度为 O(n²)。
空间复杂度
一共存储 n×n 个元素,空间复杂度为 O(n²)。
个人理解:
总结下来动态规划实际上是为了有相互关联的问题服务的,如最优解问题,他们都需要前面的最优解来得到现有的最优解。比之前纯遍历要快且占用小了许多。

浙公网安备 33010602011771号