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.
分析:动态规划,递归和迭代都行
class Solution {
int dp[1000][1000];
public:
int DFS(vector<vector<int> > &grid, int i, int j) {
if(i < 0 || j < 0) return INT_MAX;
if(dp[i][j] != -1) {
return dp[i][j];
}
dp[i][j] = min( DFS(grid, i - 1, j) , DFS(grid, i, j - 1) ) + grid[i][j];
return dp[i][j];
}
int minPathSum(vector<vector<int> > &grid) {
int m = grid.size();
int n = grid[0].size();
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
dp[i][j] = -1;
}
}
dp[0][0] = grid[0][0];
return DFS(grid, m - 1, n - 1);
}
};
class Solution {
int dp[1000][1000];
public:
int minPathSum(vector<vector<int> > &grid) {
int m = grid.size();
int n = grid[0].size();
int i, j;
int path = 0;
for(i = 0; i < n; i++) {
dp[0][i] = path + grid[0][i];
path = dp[0][i];
}
path = 0;
for(j = 0; j < m; j++) {
dp[j][0] = path + grid[j][0];
path = dp[j][0];
}
int ret = INT_MAX;
for(i = 1; i < m; i++) {
for(j = 1; j < n; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m -1][n - 1];
}
};