64. Minimum Path Sum

来源:互联网 发布:淘宝买手机店铺推荐 编辑:程序博客网 时间:2024/06/07 11:42

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];}
1 0
原创粉丝点击