题目:
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[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j];其中初始值为dp[0][0] = grid[0][0]。
代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
vector<vector<int>> dp;
int m = grid.size();
int n = grid[0].size();
if(m == 0&&n == 0)
return 0;
for(int i = 0;i<m;i++)
dp.push_back(vector<int>());
for(int i = 0;i<m;i++)
{
for(int j = 0;j<n;j++)
dp[i].push_back(0);
}
dp[0][0] = grid[0][0];
if(m == 1&&n == 1)
return dp[0][0];
int i = 0,j = 0;
for(int i = 0;i<m;i++)
{
for(int j = 0;j<n;j++)
{
if(i-1>=0&&j-1>=0)
dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j];
else if(i-1>=0)
dp[i][j] = dp[i-1][j]+grid[i][j];
else if(j-1>=0)
dp[i][j] = dp[i][j-1]+grid[i][j];
}
}
return dp[m-1][n-1];
}
};