codecamp

动态规划 礼物的最大值

题目

在一个 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

解法

1.利用动态规划思想,最后一个值如何获得最大值?就是让他的前一项是最大的,再加上他就是最大。

2.往前套,画出表格列出公式

max[i][j]=grid[i-1][j-1]+Math.max(max[i-1][j],max[i][j-1]);

在左边或者上边中寻找最大值加上自身的值

3放入循环之中

4.注意事项:数组的大小应该传入数组的大一格,不然要加入很多判断条件



class Solution {
    public int maxValue(int[][] grid) {
        int n=grid.length;
        int m=grid[0].length;
        int max[][]=new int[n+1][m+1];
        for(int i=1;i<=n;i++){
            for (int j=1;j<=m;j++){
                max[i][j]=grid[i-1][j-1]+Math.max(max[i-1][j],max[i][j-1]);
            }
        }

        
        return max[n][m]; 
    }
}
动态规划 连续子数组的最大和
贪心算法 玩筹码
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

趣味题

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }