分析“动态规划——最低通行费用”

  1. for(int i=2;i<=n;i++){
    for(int j=2;j<=n;j++){
    dp[i][j]=min(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]);
    }
    }
    dp[i][j] = 从 (1,1) 出发到达 (i,j) 的最小通行费之和(含 a[i][j] )。
    起点: dp[1][1]=a[1][1] ;
    2.表的维度:二维表 dp[1..n][1..n] ,共 n ² 个状态,每个状态对应一个子问题“到达 (i,j) 的最小费用”
    填表范围 :1≤i≤n, 1≤j≤n (下标从 1 开始,0 行 0 列仅作哨兵)
    填表顺序 :按行优先( i 从 1 到 n ,每行内 j 从 1 到 n )即可。因为 dp[i][j] 只依赖 dp[i−1][j] (上一行,已算完)和 dp[i][j−1] (同一行左侧,已算完),该顺序保证“用到的一定已算出”。等价地,按列优先或按反对角线( i+j 从小到大)分层填表也正确;反之若乱序或从右下往左上扫则错误
    原问题最优值 :dp[n][n] ,即表格右下角元素
    3.时间复杂度:读入 n 2 个数耗时 Θ(n 2 ) ;填表时每个状态只做常数次比较与加法,共 n 2 个状态,故总时间为 Θ(n² ) 。
    空间复杂度:二维数组 dp 与 a 各占 Θ(n²) ,合计 Θ(n²) 。

对动态规划算法的理解和体会:1. 动态规划不是“背公式”,而是“先证明能 DP,再写转移”。
2. 三要素必须一一落实:状态定义、转移方程、边界与顺序。
3. 填表顺序由依赖关系决定,而不是由习惯决定。

posted @ 2026-10-27 22:20  gylllllllll  阅读(7)  评论(0)    收藏  举报