Minimum Path Sum

来源:互联网 发布:电影资源知乎 编辑:程序博客网 时间:2024/06/07 16:08

题目:

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.


题目意思:

  一个m x n 的网格,每个格子里有一个非负整数,找到一条从左上角到右下角的路径,使其经过的格子数值之和最小,每一步只能向右或向下。

解题思路:

本题使用动态规划来做,整个求解过程可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值,填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。

本题我们首先可以找出递推关系,比如设存放起点到每个格子 i,j 的最小路径和的二维数组为 MPS[i][j],那么递推公式为:

MPS[i][j] = Min(MPS[i-1][j],MPS[i][j-1])+ val[i][j];

即格子 i,j 的MPS值可能有两个来源:其左侧格子 i,j-1 或者其上侧格子 i-1,j ;取这两个来源的较小MPS值,再加上当前格子的值 val[i][j] 即为结果。

由于是从左上方向右下方走,故我们可以利用一个双重循环来进行迭代计算,外层循环以行为单位,内层循环以列为单位,这样可以利用已经计算好的阶段 、

状态来计算当前格子的结果。

代码如下:


class Solution {  
public:  
    int minPathSum(vector<vector<int> > &grid) {  
        if(grid.size()==0)  
            return 0;  
        vector<vector<int>> res(grid);  
        int i, j;  
        for(int j=1; j<res[0].size(); ++j){  
            res[0][j] += res[0][j-1];  
        }  
        for(int j=1; j<res.size(); ++j){  
            res[j][0] += res[j-1][0];  
        }  
        for(i=1; i<res.size(); ++i){  
            for(int j=1; j<res[i].size(); ++j){  
                res[i][j] = min(res[i-1][j], res[i][j-1])+grid[i][j];  
            }  
        }  
        return res[grid.size()-1][grid[0].size()-1];    
    }  
};  

原创粉丝点击