第三周作业
动态规划法求解“数字三角形”问题实践报告
一、问题描述
数字三角形由n行数字组成,第i行(从1开始计数)有i个数字。从三角形顶部(第1行第1个数字)出发,每次只能向左下或右下方向移动到下一行数字,求从顶部走到底部的所有路径中,路径上数字之和的最大值。
二、动态规划求解步骤分析
2.1 最优子结构性质与递归方程式
2.1.1 最优子结构分析
设数字三角形第i行第j个元素为a[i][j](i、j均从1开始计数)。从a[i][j]出发到三角形底部的最大路径和记为dp[i][j]。
要使dp[i][j]最大,下一步只能走到a[i+1][j]或a[i+1][j+1],因此dp[i][j]的最优解必然包含dp[i+1][j]或dp[i+1][j+1]的最优解,即问题具有最优子结构性质。
2.1.2 递归方程式定义
基于最优子结构,递归方程为:
dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1])
含义:从a[i][j]出发的最大路径和 = 当前元素值 + 下一行两个可达位置的最大路径和中的较大值。
2.1.3 边界条件
当到达三角形底部(i = n)时,路径无法继续延伸,此时路径和即为当前元素自身,边界条件为:
dp[n][j] = a[n][j](j从1到n)
2.2 填表法相关设计
2.2.1 表的维度
采用二维表格dp存储子问题最优解,维度为n×n(因第i行有i个元素,表格右下方部分无实际意义,可忽略)。其中dp[i][j]对应从第i行第j个元素到顶部的最大路径和。
2.2.2 填表范围
填表范围为i从n-1 downto 1(从倒数第二行向上遍历至第一行),j从1 to i(每行从第一个元素遍历至最后一个元素)。
2.2.3 填表顺序
采用从下往上的填表顺序:先计算底部行(边界条件),再依次计算倒数第二行、倒数第三行……直至第一行。每行内部按从左到右顺序填写,确保计算dp[i][j]时,dp[i+1][j]和dp[i+1][j+1]已完成计算。
2.2.4 原问题最优值
原问题是求从顶部(a[1][1])到顶部的最大路径和,对应表格中dp[1][1]元素,即表格左上角元素。
2.3 算法时间与空间复杂度分析
2.3.1 时间复杂度
填表过程中,需遍历n-1行(从第1行到第n-1行),每行遍历i个元素(i从1到n-1),总运算次数为1+2+3+…+(n-1) = n(n-1)/2,时间复杂度为O(n²)。
2.3.2 空间复杂度
若使用完整二维表格dp[n][n]存储子问题解,空间复杂度为O(n²)。
优化方案:因计算第i行时仅需第i+1行的数据,可使用一维数组dp[j](长度为n),每次覆盖更新,空间复杂度可优化为O(n)。
三、对动态规划算法的理解和体会
3.1 核心思想认知
动态规划的核心是“分解子问题、利用重叠子问题、依托最优子结构”:将原问题分解为规模更小的子问题,通过存储子问题的最优解避免重复计算,最终由子问题最优解推导出原问题最优解。数字三角形问题中,从顶部到底部的路径可分解为从下一行元素到顶部的路径,正是这一思想的体现。
3.2 适用场景总结
动态规划适用于具有最优子结构和重叠子问题的问题:最优子结构保证子问题最优解能推导原问题最优解;重叠子问题则是动态规划提高效率的关键——若子问题不重叠,动态规划与分治法无本质区别。除数字三角形外,最长公共子序列、背包问题、最短路径问题等均是典型应用场景。
3.3 实践应用感悟
动态规划的难点在于定义子问题状态dp[i][j]和推导递归方程:状态定义需准确对应子问题核心,递归方程需贴合状态含义和最优子结构。初期容易陷入“从上往下”的递归思维(易导致重复计算),而“从下往上”的填表法更易落地实现。同时,空间优化的核心是发现“当前状态仅依赖有限个前序状态”,合理压缩存储规模。

浙公网安备 33010602011771号