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,来临时存储