今日题目
T64 最小路径和
题目描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
标签
动态规划
解析
非常典型的动态规划方程,只要能写出dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
,后面的应该都不难写。注意边界处的路径和其实可以直接导出。
python解法
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid or not grid[0]:
return 0
rows, columns = len(grid), len(grid[0])
dp = [[0] * columns for _ in range(rows)]
dp[0][0] = grid[0][0]
for i in range(1, rows):
dp[i][0] = dp[i - 1][0] + grid[i][0]
for i in range(1, columns):
dp[0][i] = dp[0][i - 1] + grid[0][i]
for i in range(1, rows):
for j in range(1, columns):
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]
return dp[rows - 1][columns - 1]
C++解法
class Solution
{
public:
int minPathSum(vector<vector<int>> &grid)
{
if (grid.size() == 0 || grid[0].size() == 0)
{
return 0;
}
int rows = grid.size(), columns = grid[0].size();
vector<vector<int>> dp(rows, vector<int>(columns));
dp[0][0] = grid[0][0];
for (int i = 1; i < rows; i++)
{
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int i = 1; i < columns; i++)
{
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for (int i = 1; i < rows; i++)
{
for (int j = 1; j < columns; j++)
{
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][columns - 1];
}
};
备注
注意dp[0][0]=grid[0][0]