剑指 Offer 47. 礼物的最大价值Java题解

好的到了新的一学期复习的时候,我动态规划又几乎不会了,算法能力小于上学期。。

面试前复习剑指Offer路过,经过写题练习,这种简单的动态规划已经会了。看到下面的话,原来我当时这都不会哈哈哈哈,加油!以后看现在觉得难的东西应该也会觉得简单吧。

二刷路过,这次也想不到。只能想到dfs,还没下手就去看看别人的题解,原来用动态规划,盒盒盒。

1.思路

设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,得到以下递推关系:
f(i,j) 等于f(i,j−1) 和f(i−1,j) 中的较大值加上当前单元格礼物价值grid[i,j]

2.代码

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

3.复杂度

时间O(M*N) 空间O(1)

4.结果

在这里插入图片描述

#超时写法

原来自己暴力的写超时了,看了题解,要用动态规划。

class Solution {
    int m=0,n=0;
    int go[][]={{0,1},{1,0}};
    int value=0,max=0;
    int[][] grid;

    public int maxValue(int[][] grid) {
        this.grid=grid;
        m=grid.length;
        n=grid[0].length;
        dfs(0,0);
        return max;
    }

    public void dfs(int x,int y){
        //检查越界
        if(test(x,y)==false){
            return;
        }

        //加入当前价值
        value+=grid[x][y];

        //到右下角
        if(x==m-1&&y==n-1){
            if(value>max){
                max=value;
            }
            return;
        }

        for(int i=0;i<2;i++){
            if(test(x+go[i][0],y+go[i][1])){
                dfs(x+go[i][0],y+go[i][1]);
                value-=grid[x+go[i][0]][y+go[i][1]];               
            }
        }
    }
    //检查越界
    public boolean test(int x,int y){
        if(x<0||y<0||x>=m||y>=n){
            return false;
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值