剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode) (leetcode-cn.com)
下述方法是建立一个二维数组,二维数组每个位置表示走到该位置时候的礼物最大价值。
int maxValue(vector<vector<int>>& grid)
{
int line = grid.size();
int col = grid[0].size();
vector<vector<int>> dp(line,vector<int>(col,0));
dp[0][0] = grid[0][0];
for(int i=1;i<line;i++)
{
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for(int i=1;i<col;i++)
{
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int i=1;i<line;i++)
{
for(int j=1;j<col;j++)
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[line-1][col-1];
上述方法很简单,但是还存在优化空间吗??
其实大可不必用一个二维矩阵,一维足够,按行更新,每行内从左往右更新,因为在二维数字时候,dp[i][j]只和他左边dp[i][j-1] 和上边dp[i-1][j]有关,因此,一维时候dp[i]在计算时,左边为dp[i-1],上面即是dp[i](还未被覆盖),因此只需要一维数组即可。
int maxValue(vector<vector<int>>& grid)
{
int line = grid.size();
int col = grid[0].size();
vector<int> dp(col,0);
dp[0] = grid[0][0];
for(int i=1;i<col;i++)
{
dp[i] = dp[i-1] + grid[0][i];
}
for(int i=1;i<line;i++)
{
for(int j=0;j<col;j++)
{
if(j==0) dp[j] = dp[0] + grid[i][j];
else dp[j] = max(dp[j-1], dp[j]) + grid[i][j];
}
}
return dp[col-1];
}