题目
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.
思路
递归求解
代码
public class Solution {
//min = grid[i,j]+Min(minPath(grid,i-1,j),minPath(grid,i,j-1))
public int MinPathSum(int[,] grid)
{
int m = grid.GetUpperBound(0);
int n = grid.GetUpperBound(1);
return minPath(grid,m,n);
}
private int minPath(int[,] grid, int i, int j)
{
int min = grid[i, j];
if (i == 0 && j == 0) return grid[0, 0];
if (i == 0)
return min + Math.Min(minPath(grid, 0, j-1), minPath(grid, 0, j - 1));
if (j == 0)
return min + Math.Min(minPath(grid, i-1, 0), minPath(grid, i-1, 0));
return min+Math.Min(minPath(grid, i - 1, j), minPath(grid, i, j - 1));
}
}
算法优化
不采用递归。
采用动态规划的思想,如下图所示,为了求得最短路径,要么是终点为h1的所有路径,或终点为h2的所有路径中的最小值,加上finish方框的值。
代码
public int MinPathSum(int[,] grid)
{
int m=grid.GetUpperBound(0)+1; //0-dimension element size
int n=grid.GetUpperBound(1)+1; //1-dimension element size
int[,] sumdp = new int[m,n];
sumdp[0,0]=grid[0,0];
//two boundaries:
for (int i = 1; i < m; i++)
sumdp[i,0] = sumdp[i-1,0]+grid[i,0];
for (int i = 1; i < n; i++)
sumdp[0,i] = sumdp[0,i-1]+grid[0,i];
//dp[i][j] = dp[i-1][j]+dp[i][j-1]
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
sumdp[i, j] = Math.Min(sumdp[i - 1, j], sumdp[i, j - 1]) + grid[i,j];
}
}
return sumdp[m - 1, n - 1];
}