链接:原题目
题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明
每次只能向下或者向右移动一步。
实例
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路(DP)
1.假设有个2 × 2的二维数组a,则a[0][0]到a[1][1]的路径有a[0][0]到a[0][1]到a[1][1]和a[0][0]到a[1][0]到a[1][1] ,所以一个点的大小(路径)取决于它左边和上边的点的大小(路径);
2.现将第一列和第一行的每个元素都累加为前面所有元素和本身的和(从一维的角度看,数组【1,2,3】中,第一个元素到第二个元素的路径和为3,一个元素到第三个元素的路径和为6,此时数组变为【1,3,6】),此时的二维数组变为:
[
[1 ,1+3 ,1+3+1],
[1+1 ,5 ,1],
[1+4+1 ,2 ,1]
]
即,
[
[1,4,5],
[2,5,1],
[6,2,1]
]
3.按照思路一的做法,获得第一个元素到每个元素的最短距离(最小累加值),如:
[
[1,4,5],
[2,5+min(4,2),1],
[6,2,1]
]
||
[
[1,4,5],
[2,7,1+min(5,7)],
[6,2+min(6,7),1]
]
||
[
[1,4,5],
[2,7,6],
[6,8,1+min(6,8)]
]
||
[
[1,4,5],
[2,7,6],
[6,8,7]
]
此时的grid[0][0]到grid[2][2]最短的路径的长度为1+3+1+1+1=7(grid[0][0]——>grid[0][1]——>grid[0][2]——>grid[1][2]——>grid[2][2])
代码
int minPathSum(int** grid, int gridSize, int* gridColSize){
int m=gridSize;
int n=gridColSize[0];
if(m==0||n==0)
return 0;
for(int i=1; i<n; i++)
grid[0][i] += grid[0][i-1];
for(int i=1; i<m; i++)
grid[i][0] += grid[i-1][0];
int x,y;
for(x=1; x<m; x++)
for(y=1; y<n; y++)
grid[x][y] += grid[x-1][y]>grid[x][y-1]?grid[x][y-1]:grid[x-1][y];
return grid[m-1][n-1];
/*在LeetCode中,系统给出的C模板遇到二维数组,grid代指二维数组的数组名,gridSize代指数组的行数,gridColSize是一个存储每一行的列数的数组的数组名,一般情况下可以用gridColSize[0]作为这个二维数组的列数*/
}