第三次作业

一、“数字三角形”动态规划实践报告

1.1 递归方程式、定义及边界条件
问题描述:数字三角形由多行数字组成,从顶部出发,每次可向下或右下走,求路径上数字和的最大值。
状态定义:设dp[i][j]表示从第i行第j列的位置出发,到达底部的最大数字和。
递归方程式:
dp[i][j] = text{triangle}[i][j] + max(dp[i+1][j], dp[i+1][j+1])
解释:当前位置的最大和等于自身数字加上“下一行相邻两个位置的最大和的较大值”。
边界条件:当i为最后一行时,dp[i][j] = \text{triangle}[i][j](底部元素的最大和就是自身)。

1.2 填表分析
表的维度:二维表格,维度为“三角形的行数 × 每行的列数”(若三角形有n行,则维度为n × n,实际有效列数为每行的长度)。
填表范围:从第n-1行(倒数第二行)开始,向上填充至第0行(第一行);每行的列数从0到当前行的列数减1
填表顺序:逆序(从下往上,每行从左到右)。因为dp[i][j]依赖于dp[i+1][j]dp[i+1][j+1],所以必须先计算下一行的状态,再计算当前行。
原问题的最优值:dp[0][0](从顶部第0行第0列出发,到达底部的最大和)。

1.3 时间和空间复杂度
时间复杂度:设三角形有n行,每个位置需要计算一次状态转移,总共有1 + 2 + 3 + dots + n = frac{n(n+1)}{2} 个位置,因此时间复杂度为O(n^2) 。
空间复杂度:
若使用二维数组存储所有状态,空间复杂度为O(n^2) 。
优化后(利用滚动数组,仅保存下一行的状态),空间复杂度可降为O(n) 。

二、对动态规划算法的理解和体会
动态规划是一种通过“分解子问题、存储子问题结果、利用子问题结果推导原问题”的算法思想,核心在于识别最优子结构和重叠子问题。

最优子结构:原问题的最优解由子问题的最优解决定(如“数字三角形”中,当前位置的最大和由下一行相邻位置的最大和决定)。这要求我们能将原问题拆解为规模更小的同类子问题。
重叠子问题:不同的原问题可能共享相同的子问题(如递归求解时会重复计算某些子状态),因此需要用表格(数组)存储子问题的结果,避免重复计算,这是动态规划效率的关键。

动态规划的解题步骤通常为:定义状态→推导状态转移方程→确定边界条件→确定填表顺序→计算并输出结果。它适用于很多最优化问题,如最短路径、背包问题等,能将指数级复杂度的递归问题优化为多项式级复杂度的迭代问题,是算法设计中“以空间换时间”的典型体现。

在实践中,动态规划的难点在于状态定义和转移方程的推导,需要对问题有深入的理解;而优化空间复杂度则是进阶方向,能进一步提升算法的效率。

posted @ 2025-11-14 19:16  刘懿洋  阅读(0)  评论(0)    收藏  举报