【题目】
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&n的网格grid,每个网格位置都有一个非负值,找一条从grid[0][0]到grid[m-1][n-1]的路径,路径上的数值之和最小,返回最小路径和。每次只能向下或者向右移动一格。
【思路】
DP问题。
思路和Unique Paths, Unique Paths II基本相同,依次计算grid[0][0]到达各网格点的最小路径和。
【代码】
/*
题意:给定一个m&n的网格grid,每个网格位置都有一个非负值,找一条从grid[0][0]到grid[m-1][n-1]的路径,路径上的数值之和最小,返回最小路径和。每次只能向下或者向右移动一格。
思路:
DP问题。
思路和Unique Paths, Unique Paths II基本相同,依次计算grid[0][0]到达各网格点的最小路径和。
*/
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
int m=grid.size();
if(m==0)return 0;
int n=grid[0].size();
if(n==0)return 0;
vector<vector<int> >minsum(m, vector<int>(n, 0));
//初始化minSum[0][0]
minsum[0][0]=grid[0][0];
//初始化第一行
for(int j=1; j<n; j++){
minsum[0][j]=minsum[0][j-1]+grid[0][j];
}
//初始化第一列
for(int i=1; i<m; i++){
minsum[i][0]=minsum[i-1][0]+grid[i][0];
}
//处理其他网格
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
minsum[i][j]=grid[i][j]+min(minsum[i-1][j], minsum[i][j-1]);
}
}
return minsum[m-1][n-1];
}
};