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

解法 动态规化
 先递归分析问题,定义函数
    
     
      
       
        f
       
       
        (
       
       
        i
       
       
        ,
       
       
        j
       
       
        )
       
      
      
       f(i,j)
      
     
    f(i,j)表示到达坐标(i, j)盒子时拿到礼物的总和的最大值。有两种途径到达坐标(i,j):通过上方盒子(i-1, j);通过左方盒子(i,j-1)。所以
    
     
      
       
        f
       
       
        (
       
       
        i
       
       
        ,
       
       
        j
       
       
        )
       
       
        =
       
       
        m
       
       
        a
       
       
        x
       
       
        (
       
       
        f
       
       
        (
       
       
        i
       
       
        −
       
       
        1
       
       
        ,
       
       
        j
       
       
        )
       
       
        ,
       
       
        f
       
       
        (
       
       
        i
       
       
        ,
       
       
        j
       
       
        −
       
       
        1
       
       
        )
       
       
        )
       
       
        +
       
       
        g
       
       
        i
       
       
        f
       
       
        t
       
       
        (
       
       
        i
       
       
        ,
       
       
        j
       
       
        )
       
      
      
       f(i,j)=max(f(i-1,j),f(i,j-1))+gift(i,j)
      
     
    f(i,j)=max(f(i−1,j),f(i,j−1))+gift(i,j) ,
    
     
      
       
        g
       
       
        i
       
       
        f
       
       
        t
       
       
        (
       
       
        i
       
       
        ,
       
       
        j
       
       
        )
       
      
      
       gift(i,j)
      
     
    gift(i,j)代表(i,j)位置礼物的价值。
  为了避免重复计算采用循环解法。定义一个辅助二维数组,数组中坐标(i, j)元素代表到达坐标(i,j)时礼物的价值总和的最大值。
class Solution {
    public int maxValue(int[][] grid) {
        if(grid == null || grid.length == 0 || grid[0].length == 0)
            return 0;
        // 棋盘的行数与列数
        int rows = grid.length;
        int cols = grid[0].length;
        // 创建一个二维数组存放f(i,j),f(i,j)代表拿到第[i,j]个礼物时的礼物价值
        for(int i = 0; i < rows; ++i) {
            for(int j = 0; j < cols; ++j) {
                int up = 0;
                int left = 0;
                if(i > 0)
                    up = grid[i-1][j];
                if(j > 0)
                    left = grid[i][j-1];
                grid[i][j] = Math.max(up, left) + grid[i][j];
            }
        }
        return grid[rows-1][cols-1];
    }
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号