第三章作业

1.动态规划实践报告:7-4 最低通行费
题目表面允许上下左右四向移动,但时间约束“必须在2N-1个单位时间内穿越”实际上将可行路径锁死为只能向右或向下。因为从左上到右下,任何不绕路的路径恰好经过2N-1个格子;一旦走回头路,格子数必然超标。这一步建模是本题动态规划解法成立的前提。
1.1 最优子结构与递归方程式
状态定义:设dp[i][j]为从起点(1,1)走到格子(i,j)所需的最小通行费,cost[i][j]为格子(i,j)本身的费用。
最优子结构分析:到达(i,j)的最后一步只可能来自上方(i-1,j)或左方(i,j-1)。若到达(i,j)的路径是最优的,则它到达(i-1,j)或(i,j-1)的那段前缀也必然是对应点的最优路径;否则用更优前缀替换即可得到整体更优解,与假设矛盾。
递归方程式:
dp[i][j] = cost[i][j] + min(dp[i-1][j], dp[i][j-1])
边界条件:
起点:dp[1][1] = cost[1][1]
第一行(i=1,j>1):只能从左边来,dp[1][j] = dp[1][j-1] + cost[1][j]
第一列(j=1,i>1):只能从上边来,dp[i][1] = dp[i-1][1] + cost[i][1]
1.2 填表法设计
表的维度:二维表dp[N+1][N+1],下标从1开始以对应网格坐标。
填表范围:i从1到N,j从1到N,覆盖全部N²个位置。
填表顺序:按行优先,从上到下、每行从左到右(即i递增、j递增)。这是因为计算dp[i][j]时依赖的dp[i-1]j和dp[i]j-1在此顺序下均已计算完毕,依赖关系得到保证。
原问题最优值:表格右下角元素dp[N][N]。
1.3 复杂度分析
时间复杂度:O(N²)。填表共N²个状态,每个状态仅做一次比较和一次加法,均为常数操作。对比暴力搜索的指数级路径枚举,动态规划通过消除重叠子问题的重复计算,将复杂度降至多项式级别。
空间复杂度:O(N²),用于存储二维dp表。若进一步优化,由于每行只依赖上一行和本行左侧,可用一维滚动数组将空间降至O(N);但本题N<100,二维写法清晰且足够。
2.对动态规划算法的理解与体会
做完这道题,我对动态规划为什么有效有了更具体的感受。暴力搜索之所以慢,是因为同一条到达某个中间格子的最优路径,会被后续无数条不同的大路径反复重算;而DP把走到某个格子的最小费用这个子问题的答案存下来,后面谁需要用就直接取,不再重算。这种记住中间结果的想法,配合最优子结构提供的正确性保证,就是DP的核心。题目条件中的约束往往隐含了状态转移的方向。表面四向移动,时间约束一卡,实际只剩右下两向,转移方程从可能的四路取最小瞬间简化成两路取最小。

posted @ 2026-10-28 08:51  Folium  阅读(7)  评论(0)    收藏  举报