动态规划|64. 最小路径和
64. 最小路径和 - 力扣(LeetCode) (leetcode-cn.com)
题目
给定一个包含非负整数的 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
解题思路
经典动态规划思想,采二维dp数组,dp[i] [j]表示从左上角到达矩阵坐标(i,j)的路径数字总和,每次只能向右或者向下,则问题可分解为转移方程dp[i] [j]为左边格子的数字和加上当前坐标的数字dp[i] [j-1]+grid[i] [j] 与 右边格子的数字和加上当前坐标的数字 dp[i-1] [j]+grid[i] [j]中选择最小的那个,即转移方程
dp[i] [j]=min{ (dp[i] [j-1]+grid[i] [j]) ,(dp[i-1] [j]+grid[i] [j]) }
代码
int minPathSum(int** grid, int gridSize, int* gridColSize){
int dp[gridSize][*gridColSize];
dp[0][0]=grid[0][0];
int i,j;
for(i=1;i<gridSize;i++)//初始化dp第一列边界
dp[i][0]=dp[i-1][0]+grid[i][0];
for(j=1;j<*gridColSize;j++)//初始化dp第一行边界
dp[0][j]=dp[0][j-1]+grid[0][j];
for(i=1;i<gridSize;i++)//构建dp数组,转移方程dp[i][j]=min{(dp[i][j-1]+grid[i][j]),(dp[i-1][j]+grid[i][j])}
for(j=1;j<*gridColSize;j++){
dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i][j-1]+grid[i][j]:dp[i-1][j]+grid[i][j];
}
return dp[gridSize-1][(*gridColSize)-1];
}