第三次算法作业
实践报告:动态规划法求解“数字三角形”问题
- 动态规划法求解步骤分析
1.1 最优子结构性质与递归方程式
问题定义:
数字三角形问题要求从三角形顶部到底部找一条路径,使得路径上数字之和最大。每一步只能走到下一行相邻的数字上。
最优子结构分析:
从顶点到达底部任意位置的最大和,等于该位置的值加上从顶点到达其上方两个相邻位置中较大者的最大和。
递归方程式定义:
设 dp[i][j] 表示从三角形顶部到达第 i 行第 j 列位置的最大路径和。
递归方程式:
text
dp[i][j] = triangle[i][j] + max(dp[i-1][j-1], dp[i-1][j])
边界条件:
当 j = 0 时(最左端):dp[i][0] = triangle[i][0] + dp[i-1][0]
当 j = i 时(最右端):dp[i][i] = triangle[i][i] + dp[i-1][i-1]
初始条件:dp[0][0] = triangle[0][0]
1.2 填表法分析
表的维度:
二维表格,大小为 n × n,其中 n 是数字三角形的行数
填表范围:
行范围:从第 0 行到第 n-1 行
列范围:对于第 i 行,从第 0 列到第 i 列
填表顺序:
从上到下,从左到右逐行填充
先填充第 0 行,然后第 1 行,依此类推直到第 n-1 行
原问题的最优值:
原问题的最优值是最后一行(第 n-1 行)中所有 dp[n-1][j] 的最大值
max_value = max(dp[n-1][0], dp[n-1][1], ..., dp[n-1][n-1])
1.3 算法复杂度分析
时间复杂度:
需要填充一个 n × n 的表格
每个单元格的计算时间为 O(1)
总时间复杂度:O(n²)
空间复杂度:
如果使用二维数组存储 dp 表:O(n²)
优化后可以只使用一维数组:O(n)
如果允许修改原三角形,可以做到 O(1) 的额外空间
- 对动态规划算法的理解和体会
2.1 动态规划的核心思想
动态规划是一种通过将复杂问题分解为相对简单的子问题的方式来求解问题的方法。其核心思想包括:
最优子结构:问题的最优解包含其子问题的最优解
重叠子问题:在递归求解过程中,相同的子问题会被多次重复计算
记忆化存储:通过表格存储已解决的子问题结果,避免重复计算
2.2 动态规划的应用特点
通过数字三角形问题的实践,我深刻体会到动态规划的以下特点:
适用场景:
问题可以分解为相互重叠的子问题
问题具有最优子结构性质
子问题的数量随着问题规模增长而多项式增长
求解步骤:
定义状态:明确 dp 数组的含义
确定状态转移方程:找出状态之间的关系
确定初始条件和边界情况
确定计算顺序
返回最终结果
2.3 实践中的收获
问题建模的重要性:
在数字三角形问题中,关键在于正确定义 dp[i][j] 的状态含义。不同的定义会导致不同的状态转移方程和求解复杂度。
边界条件的处理:
边界条件往往容易被忽视,但却是算法正确性的关键。在数字三角形中,左右边界的特殊处理确保了算法的完整性。
空间优化技巧:
通过观察状态转移的依赖关系,我发现可以使用滚动数组技术将空间复杂度从 O(n²) 优化到 O(n),这体现了动态规划的灵活性。
从递归到递推的思维转变:
动态规划教会了我如何将自然的递归思路转化为高效的递推实现,这种思维模式对于解决复杂问题非常有价值。
2.4 对算法设计的启示
动态规划不仅是一种具体的算法技术,更是一种重要的算法设计范式。它强调了:
分治思想:将大问题分解为小问题
空间换时间:通过存储中间结果提高效率
自底向上:从小问题开始逐步构建大问题的解
通过本次数字三角形问题的实践,我更加深入地理解了动态规划的精髓,这种思维方式将对我未来解决更复杂的算法问题产生深远影响。

浙公网安备 33010602011771号