其他分享
首页 > 其他分享> > 剑指 Offer 47. 礼物的最大价值(动态规划)

剑指 Offer 47. 礼物的最大价值(动态规划)

作者:互联网

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

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

 

示例 1:

输入: 
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

 

提示:

方法一:常规动态规划时间和空间复杂度均为O(m * n)

 1 class Solution {
 2 public:
 3     // dp[i][j]到达(i,j)方格时拿到礼物最多价值
 4     // 状态转移方程dp[i][j] = grid[i][j] + max(dp[i][j - 1], dp[i - 1][j])
 5     int maxValue(vector<vector<int>>& grid) {
 6         if (grid.size() == 0 || grid[0].size() == 0) {
 7             return 0;
 8         }
 9         int row = grid.size();
10         int col = grid[0].size();
11         vector<vector<int>> dp(row, vector<int>(col, 0));
12         dp[0][0] = grid[0][0];
13         // 当i == 0 && j != 0时,dp[i][j] = dp[i][j - 1] + grid[i][j]
14         // 当i != 0 && j == 0时,dp[i][j] = dp[i - 1][j] + grid[i][j]
15         // 当i != 0 && j != 0时,dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] 
16         for (int i = 0; i < row; i++ ) {
17             for (int j = 0; j < col; j++) {
18                 if (i == 0 && j == 0) {
19                     continue;
20                 }
21                 if (i == 0 && j != 0) {
22                     dp[i][j] = dp[i][j - 1] + grid[i][j];
23                 } else if (i != 0 && j == 0) {
24                     dp[i][j] = dp[i - 1][j] + grid[i][j];
25                 } else {
26                     dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
27                 }
28             }
29         }
30         return dp[row - 1][col - 1];
31     }
32 };

 

方法二:优化空间复杂度为O(1)后的动态规划

 1 class Solution {
 2 public:
 3     // dp[i][j]到达(i,j)方格时拿到礼物最多价值
 4     // 状态转移方程dp[i][j] = grid[i][j] + max(dp[i][j - 1], dp[i - 1][j])
 5     int maxValue(vector<vector<int>>& grid) {
 6         if (grid.size() == 0 || grid[0].size() == 0) {
 7             return 0;
 8         }
 9         int row = grid.size();
10         int col = grid[0].size();
11         // 当i == 0 && j != 0时,dp[i][j] = dp[i][j - 1] + grid[i][j]
12         // 当i != 0 && j == 0时,dp[i][j] = dp[i - 1][j] + grid[i][j]
13         // 当i != 0 && j != 0时,dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] 
14         for (int i = 0; i < row; i++ ) {
15             for (int j = 0; j < col; j++) {
16                 if (i == 0 && j == 0) {
17                     continue;
18                 }
19                 if (i == 0) {
20                     grid[i][j] += grid[i][j - 1]; // 前一列累加
21                 } else if (j == 0) {
22                     grid[i][j] += grid[i - 1][j];
23                 } else {
24                     grid[i][j] += max(grid[i - 1][j], grid[i][j - 1]);
25                 }
26             }
27         }
28         return grid[row - 1][col - 1];
29     }
30 };

 

标签:row,Offer,int,47,grid,&&,size,dp,礼物
来源: https://www.cnblogs.com/MGFangel/p/16339370.html