434
社区成员
发帖
与我相关
我的任务
分享(1) 状态表示
b[i][j] 为从左上角 (0, 0) 到达位置 (i, j) 的最小费用。b[0][0],即从起点 (0, 0) 到终点 (n-1, n-1) 的最小通行费用。(2) 状态方程
在位置 (i, j),有两个可能的路径来源,即从左边的方格 (i, j+1) 或从下方的方格 (i+1, j) 来到 (i, j)。我们选择使费用最小的路径。
动态规划方程为:
b[i][j]=a[i][j]+min(b[i][j+1],b[i+1][j])b[i][j] = a[i][j] + \min(b[i][j+1], b[i+1][j])b[i][j]=a[i][j]+min(b[i][j+1],b[i+1][j])其中,a[i][j] 是在位置 (i, j) 的通行费用,b[i][j+1] 和 b[i+1][j] 分别是从右侧和下方位置到达 (i, j) 所需的最小费用。
(3) 边界条件
b[n-1][n-1] = a[n-1][n-1],即最后一个位置的费用即为它本身。b[n-1][j],只能从右边往左依次填充:b[n-1][j] = a[n-1][j] + b[n-1][j+1]。b[i][n-1],只能从下往上依次填充:b[i][n-1] = a[i][n-1] + b[i+1][n-1]。(4) 时间、空间复杂度分析
O(N^2),需要遍历整个 N×N 网格,并对每个格子进行常数次的计算。O(N^2),需要 b[i][j] 数组来保存每个位置的最小费用。
动态规划解决问题的核心在于子问题的分解和最优子结构的利用。对于这个问题,可以观察到商人从某个格子 (i, j) 到右下角的最小费用只依赖于他右侧和下方的格子。通过逆向构建 b[i][j] 表格,可以找到全局最优解。
在实现动态规划时,状态方程的推导尤为重要,它反映了我们如何从子问题中获得解。此外,边界条件的处理和初始化也直接影响最终结果的正确性。
通过解决这种问题,可以理解动态规划不仅适用于一维和二维数组的最短路径问题,也可以应用到很多问题的最优解上。这类算法思想是基础且极具实用性的。