zoukankan      html  css  js  c++  java
  • 剑指Offer对答如流系列

    面试题47:礼物的最大价值

    题目描述

    在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?

    比如下面的棋盘中,如果按照红色数字的路线走可以拿到最大价值为53的礼物

    在这里插入图片描述

    问题分析

    动态规划:定义f(i,j)为到达(i,j)位置格子时能拿到的礼物总和的最大值,则有:f(i,j)=max{f(i-1,j),f(i,j-1)}+values(i,j)。(i,j)的可能由(i-1,j)或(i,j-1)到的

    同上道题一样剑指Offer对答如流系列 - 把数字翻译成字符串,如果直接使用递归会产生大量的重复计算,因此,创建辅助的数组来保存中间计算结果。

    辅助数组不用和m*n的二维数组一样大,只需要保存上一层的最大值就可以。可以使用长度为列数n的一位数组作为辅助数组。不过为了便于理解,代码中使用二维辅助数组。

    问题解答

     public int maxValueOfGifts(int[][] values) {
            if(values==null || values.length<=0 ||values[0].length<=0) {
                return 0;
            }
    
            int rows=values.length;
            int cols=values[0].length;
    
            int[][] maxValue=new int[rows][cols];
    
            Arrays.fill(maxValue, 0);
            for(int i=0;i<rows;i++) {
                for(int j=0;j<cols;j++) {
                    int left=0;
                    int up=0;
                    if(i>0) {
                        up=maxValue[i-1][j];
                    }
                    if(j>0) {
                        left=maxValue[i][j-1];
    
                    }
                    maxValue[i][j]=Math.max(up, left)+values[i][j];
                }
            }
            return maxValue[rows-1][cols-1];
        }
    
  • 相关阅读:
    HTML5元素标记释义
    Mvc使用Partial View 来封装上传控件
    订单页过滤,sql写法
    防止提交重复订单的方法
    查询数据库所有列
    asp.net 异常处理
    7. DateTime,TimeSpan
    8.1.thread
    8.2.Task
    2.2. Array
  • 原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12246530.html
Copyright © 2011-2022 走看看