using System;
using System.Collections.Generic;
class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型二维数组 the matrix
* @return int整型
*/
public int rows,cols;
public int minPathSum (List<List<int>> matrix) {
// write code here
rows=matrix.Count;
cols=matrix[0].Count;
Dictionary<string, int> map=new Dictionary<string, int>();
return minPathSum(matrix, rows-1, cols-1, map);
}
public int minPathSum(List<List<int>> grid,int i,int j,Dictionary<string, int> map)
{
if(i==0 && j==0)
return grid[i][j];
string key=i+"*"+j;
if(map.ContainsKey(key))
return map[key];
int res=0;
if(i==0)
res=grid[i][j]+minPathSum(grid, i, j-1, map);
else if(j==0)
res=grid[i][j]+minPathSum(grid, i-1, j, map);
else
res=grid[i][j]+Math.Min(minPathSum(grid, i, j-1, map),minPathSum(grid, i-1, j, map));
map.Add(key,res);
return res;
}
}
虽然是递归算法,但是容易理解,
1.两边缘的点是直接求得的,然后就可以求得与两边缘相邻的点,依次扩散,只是递归是倒过来的
2.为了避免大量重复计算,这里用了一个map,来临时存储