https://leetcode.com/problems/minimum-path-sum/
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.
简单的DP问题
public int MinPathSum(int[,] grid)
{
int m = (int)grid.GetLongLength(0);
int n = (int)grid.GetLongLength(1);
if (m * n == 0)
return 0;
if (m * n == 1)
return grid[0, 0];
int[,] mat = new int[m,n];
mat[0, 0] = grid[0, 0];
for (int j = 1; j < n; j++)
mat[0, j] = mat[0, j - 1] + grid[0, j];
for (int i = 1; i < m; i++)
mat[i, 0] = mat[i-1,0] + grid[i,0];
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
mat[i, j] = Math.Min(mat[i, j - 1], mat[i - 1, j]) + grid[i, j];
}
}
return mat[m - 1, n - 1];
}
优化一下,节省空间
public int MinPathSum(int[,] grid)
{
int m = (int)grid.GetLongLength(0);
int n = (int)grid.GetLongLength(1);
if (m * n == 0)
return 0;
if (m * n == 1)
return grid[0, 0];
int[] mat = new int[n];
mat[0] = grid[0, 0];
for (int j = 1; j < n; j++)
mat[j] = mat[j - 1] + grid[0, j];
for (int i = 1; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (j == 0)
mat[j] += grid[i, j];
else
mat[j] = Math.Min(mat[j - 1], mat[j]) + grid[i, j];
}
}
return mat[n - 1];
}