1. 题目描述
2. 题目理解
典型的动态规划问题,直接看状态数组的定义:
状态数组:dp[i][j]表示从起始位置到(i, j)能获得的最大的价值。
状态转移方程:dp[i][j] = grid[i][j] + max( dp[i-1][j], dp[i][j-1] )
就是,在当前grid[i][j]所能获得的最大价值=上一个位置所能获得的最大价值+当前位置的价值,其中上一个位置可以是在当前位置的正上方,也可以是当前位置的左边。
base case:就是在矩阵的最上一条边和最左边一条边,到达grid[0][i]和grid[j][0]的路径只有一个,因此dp[0][i]和dp[j][0]是base case ,单独考虑。
3. 代码
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
//动态规划
//dp[i][j]表示从起始位置到(i, j)能获得的最大的价值
int col=grid.size();
int row=grid[0].size();
vector<vector<int>> dp(col,vector<int>(row,0));
//base case:
//上边界和左边界
int tmp=0;
for(int i=0;i<col;i++){
tmp+=grid[i][0];
dp[i][0]=tmp;
}
tmp=grid[0][0];
for(int j=1;j<row;j++){
tmp+=grid[0][j];
dp[0][j]=tmp;
}
//基本情况 dp[i][j]=grid[i][j]+max(dp[i-1][j],dp[i][j-1]);
for(int i=1;i<col;i++){
for(int j=1;j<row;j++){
dp[i][j]=grid[i][j]+max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[col-1][row-1];
}
};