[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(i1,j),f(i,j1))+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];
    }
}
posted @ 2020-09-10 09:06  消灭猕猴桃  阅读(70)  评论(0编辑  收藏  举报