64. Minimum Path Sum

    xiaoxiao2025-02-16  19

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

    Note: You can only move either down or right at any point in time.

    这题跟之前的unique paths其实是一回事。都是基本的dynamic programming题。dp就是在于小问题向大问题积累记录,避免直接枚举或者回溯带来的对小问题的重复计算。这一点将会在后续的dp总结博客里解释,此处不做深入。

    代码一:

    int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> minpath(grid); //初始化第一行和第一列 for (int i = 1; i < m; i++) { minpath[i][0] += minpath[i-1][0]; } for (int j = 1; j < n; j++) { minpath[0][j] += minpath[0][j-1]; } // 逐步递进 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { minpath[i][j] = min(minpath[i-1][j], minpath[i][j-1]) + grid[i][j]; } } return minpath[m-1][n-1]; }

    当然,这题还能再稍微优化一下,就是不用构造完整二维数组,可以用一维滚动数组完成,节约内存。 代码二:

    int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<int> minpath(n, INT_MAX); minpath[0] = 0; //初始化:第一项为0为了累加方便,其他为INT_MAX因为后面有min操作 for (int i = 0; i < m; i++) { minpath[0] += grid[i][0]; for (int j = 1; j < n; j++) { minpath[j] = min(minpath[j], minpath[j-1]) + grid[i][j]; } } return minpath[n-1]; }
    转载请注明原文地址: https://ju.6miu.com/read-1296515.html
    最新回复(0)