算法第三章作业

一、实践报告:7-4 最低通行费

1.1 最优子结构与递归方程

设 cost[i][j] 表示网格第 i 行第 j 列的费用,dp[i][j] 表示从左上角 (1,1) 走到 (i,j) 的最小费用。

由于商人必须在 2N-1 个单位时间内从左上角走到右下角,而网格是 N×N 的,从 (1,1) 到 (N,N) 最少需要走 2N-1 步,所以实际上只能向右或向下移动。

递归方程为:

dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + cost[i][j]

边界条件:

dp[1][1] = cost[1][1]
第一行只能从左边来:

dp[1][j] = dp[1][j-1] + cost[1][j]

第一列只能从上面来:

dp[i][1] = dp[i-1][1] + cost[i][1]

1.2 填表法

表的维度:二维表 dp[N][N]。
填表范围:i 从 1 到 N,j 从 1 到 N。
填表顺序:按行从上到下、每行从左到右填表;也可以按列从左到右、每列从上到下填表。只要保证计算 dp[i][j] 时,dp[i-1][j] 和 dp[i][j-1] 已经计算完成即可。
原问题最优值:dp[N][N],即从左上角走到右下角的最小费用。

1.3 时间与空间复杂度

时间复杂度:O(N^2)。因为需要遍历 N×N 的网格,每个格子只计算一次。
空间复杂度:O(N^2)。需要一个二维数组存储 dp 表。如果使用滚动数组优化,可以降到 O(N),但本题 N < 100,直接使用二维数组即可。

二、对动态规划算法的理解和体会

动态规划的核心思想是把复杂问题分解成重叠子问题,通过保存子问题的解来避免重复计算。它适合解决具有最优子结构和重叠子问题性质的问题。

最优子结构意味着:一个问题的最优解包含其子问题的最优解。比如本题中,到达 (i,j) 的最小费用,取决于到达 (i-1,j) 和 (i,j-1) 的最小费用。

重叠子问题意味着:在递归求解过程中,同一个子问题会被多次计算。动态规划通过填表或记忆化的方式,把每个子问题只算一次。

写动态规划题时,我通常会按以下步骤思考:

定义状态:明确 dp[i][j] 代表什么含义。
找状态转移方程:思考当前状态如何由之前的状态推导而来。
确定边界条件:找出初始值,避免越界。
确定填表顺序:保证计算当前状态时,依赖的子状态已经算好。
提取答案:确认最终答案对应哪个表格元素。

动态规划和贪心算法的区别在于:贪心每一步都选局部最优,但不一定能得到全局最优;而动态规划会考虑所有可能的选择,通过比较得到全局最优解。动态规划的关键在于正确设计状态和转移方程,这需要多做题、多总结才能熟练掌握。

posted @ 2026-11-03 18:38  yang31  阅读(5)  评论(0)    收藏  举报