PROBLEM

剑指 Offer 47. 礼物的最大价值

难度 中等

MY ANSWER

典型的动态规划,不能使用贪心时,就看能否使用动态规划。转移方程为:

时间复杂度O(mn),空间复杂度O(mn)。

class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(grid.empty()) {
return 0;
}
vector<vector<int>> dp(grid.size(), vector<int>(grid[0].size(), 0));
dp[0][0] = grid[0][0];
for(int i = 1; i < dp[0].size(); i++) {
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int i = 1; i < dp.size(); i++) {
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for(int i = 1; i < dp.size(); i++) {
for(int j = 1; j < dp[0].size(); j++) {
dp[i][j] = grid[i][j] + max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[dp.size()-1][dp[0].size()-1];
}
};

BETTER SOLUTION

若可以在原矩阵上修改,就可以将空间复杂度降低到常数。

class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
if(grid.empty()) {
return 0;
}
for(int i = 1; i < grid[0].size(); i++) {
grid[0][i] += grid[0][i-1];
}
for(int i = 1; i < grid.size(); i++) {
grid[i][0] += grid[i-1][0];
}
for(int i = 1; i < grid.size(); i++) {
for(int j = 1; j < grid[0].size(); j++) {
grid[i][j] += max(grid[i-1][j], grid[i][j-1]);
}
}
return grid[grid.size()-1][grid[0].size()-1];
}
};

SUMMARY

  • 二维vector初始化一个和grid一样大的矩阵dp:vector<vector<int>> dp(grid.size(), vector<int>(grid[0].size(), 0));
  • 若允许原地修改,可考虑通过原地修改降低空间复杂度。