64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
题解:
常规dp问题,我们发现坐标为(i,j)时其只能要么从(i-1,j)下移得到,要么从(i,j-1)右移得到,因此分两种进行求max即可。当然需要注意一下边界问题。
代码:
int minPathSum(int** grid, int gridSize, int* gridColSize){
int dp[gridSize][gridColSize[0]];
dp[0][0] = grid[0][0];
for(int i=0;i<gridSize;i++)
{
for(int j=0;j<gridColSize[0];j++)
{
if(i==0&&j==0)
continue;
if(j==0)
{
dp[i][j] = dp[i-1][j]+grid[i][j];
continue;
}
if(i==0)
{
dp[i][j] = dp[i][j-1]+grid[i][j];
continue;
}
else
{
dp[i][j] = fmin(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
}
}
}
return dp[gridSize-1][gridColSize[0]-1];
}