解法一
判断标准则是选左边的格子的最大价值或者上边格子的最大价值,然后加上该格子的礼物价值。
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(grid.size()==0 && grid[0].size()==0) return 0;
int row = grid.size(), colums = grid[0].size();
vector<vector<int>> dp(row,vector<int>(colums,0));
for (int i = 0; i < row; i++)
{
for (int j = 0; j < colums; j++)
{
int left=0,up=0;
if(j>0) up=dp[i][j-1];
if(i>0) left=dp[i-1][j];
dp[i][j]=max(left,up)+grid[i][j];
}
}
return dp[row-1][colums-1];
}
};
解法二
我们只需要定义一个长度为 columns 的一维数组来保存每次循环我们需要的数据。
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(grid.size()==0 && grid[0].size()==0) return 0;
int row = grid.size(), colums = grid[0].size();
vector<int> dp(colums,0);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < colums; j++)
{
int left=0,up=0;
if(j>0) up=dp[j-1];
if(i>0) left=dp[j];
dp[j]=max(left,up)+grid[i][j];
}
}
return dp[colums-1];
}
};