dp练习第五天-剑指 Offer 47. 礼物的最大价值

题目

 

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

 

示例 1:

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

 

提示:

  • 0 < grid.length <= 200
  • 0 < grid[0].length <= 200

分析

看到只能往右走或者往下走,一定是一道典型的dp题。

注:如果可以上,左方向走,那么一定不是一道dp!

公式:dp[i][j]=max(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);


代码

 1 class Solution {
 2 public:
 3     int dp[200][200]; 
 4     int maxValue(vector<vector<int>>& grid) {
 5         if(grid.size()<=0)
 6         {
 7             return 0;
 8         }
 9         if(grid[0].size()<=0)
10         {
11             return 0;
12         }
13         dp[0][0]=grid[0][0];
14         for(int i=1;i<grid.size();i++)
15         {
16             dp[i][0]=grid[i][0]+dp[i-1][0];
17         }
18         for(int j=1;j<grid[0].size();j++)
19         {
20             dp[0][j]=grid[0][j]+dp[0][j-1];
21         }
22         for(int i=1;i<grid.size();i++)
23         {
24             for(int j=1;j<grid[0].size();j++)
25             {
26                 dp[i][j]=max(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
27             }
28         }
29         return dp[grid.size()-1][grid[0].size()-1];
30     }
31 };

 

 

posted @ 2021-02-16 22:38  _厨师沙拉  阅读(61)  评论(0)    收藏  举报