题目链接
思路分析
这道题目读到题目中的最大价值就应该联想到可能需要使用动态规划来对该问题进行求解
由于我们拿礼物的方向只能是向右或者向下,所以每一格都面临着两种选择,要么选择向右,要么选择向下,我们自然是要选择这两者中较大的一个,详细解释写在代码的注释里面
解题代码
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
//dp[i][j]的意思是就是在[i][j]这个位置礼物的最大价值
vector<vector<int>> dp(grid.size(), vector<int>(grid[0].size(), 0));
//初始化dp数组,dp数组第一行第一列
int m = grid.size();
int n = grid[0].size();
dp[0][0] = grid[0][0];
//对dp数组进行初始化
//我们考虑[i][j]位置的礼物最大价值 它取决于[i-1][j]和[i][j-1]两个方面
//如果取[i-1][j] dp[i][j] = dp[i-1][j] + grid[i][j];
//如果取[i][j-1] dp[i][j] = dp[i][j-1] + grid[i][j];
//那么我们如何选择是dp[i-1][j] 还是 dp[i][j-1]
//由于我们所求的是最大礼物的价值,因此是要选择两者的较大值
//因此 递推公式为dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j];
//找到递推公式之后,我们需要初始化dp数组,由递推公式可以得到,我们要计算[i][j] 就要知道[i-1][j] 和 [i][j-1] 因此我们需要初始化第一行第一列
for(int i = 1; i < n; ++i)
{
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int j = 1; j < m; ++j)
{
dp[j][0] = dp[j-1][0] + grid[j][0];
}
for(int i = 1; i < m; ++i)
{
for(int j = 1; j < n; ++j)
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[m-1][n-1];
}
};