1. 程式人生 > 實用技巧 >劍指47 禮物的最大價值

劍指47 禮物的最大價值

在一個 m*n 的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格子裡的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定一個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?

示例 1:

輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 12
解釋: 路徑 1→3→5→2→1 可以拿到最多價值的禮物

同樣是一道遞迴思路,但是使用遞迴會導致重複計算的問題。

採用動態規劃,位置ij的最大價值取決於ij-1和i-1j的值。

可以用一個二維陣列記錄每個點的最大值,但是要注意其實只用一個一維陣列,當前位置ij,那麼0-j-1記錄的就是該行左側的,j到cols記錄的就是上面的。

養成釋放動態申請的空間的好習慣。

 1 class Solution {
 2 public:
 3     int maxValue(vector<vector<int>>& grid) {
 4         if(!grid.size())
 5             return 0;
 6         int rows=grid.size(),cols=grid[0].size();
 7         int *record;
 8         record=new int[cols];
 9         for(int i=0;i<rows;i++){
10 for(int j=0;j<cols;j++){ 11 int left=0,up=0; 12 if(i>0) 13 up=record[j]; 14 if(j>0) 15 left=record[j-1]; 16 record[j]=max(left,up)+grid[i][j]; 17 } 18 } 19 int
ret=record[cols-1]; 20 delete []record; 21 return ret; 22 } 23 };