zoukankan      html  css  js  c++  java
  • leetcodeF47 礼物的最大价值

    * @Description 从左上角开始移动,每次移动可以向右也可以向下
    * 问题本身自带状态转移关系,下一步状态基于上一步位置
    * 建立缓存时以位置为坐标,G(x,y) 表示从 x/y 坐标开始行动可以获取的最大价值
    * 因为有最大的含义, x/y 坐标可以唯一的确定 从本位置开始移动可获得的最大价值,以这两个坐标建立的缓存是有效的
    * 那么尝试定义状态转移方程:
    * G(x,y) = max{ G(x-1,y) , G(x,y-1) } + grid[x][y]
    * x,y 只能从 x-1,y 及 x,y-1 转移过来,该转移过程可以完整覆盖解空间
    * 当 x<0 或者 y<0 时以 0 回归,代表无价值

        public int maxValue(int[][] grid) {
            int[][] cache = new int[grid.length+1][grid[0].length+1];
            return maxValue(grid, grid.length - 1, grid[0].length - 1, cache);
        }
    
    
        /**
         * @Author Nxy
         * @Date 2020/5/16 23:56
         * @Description 从左上角开始移动,每次移动可以向右也可以向下
         * 问题本身自带状态转移关系,下一步状态基于上一步位置
         * 建立缓存时以位置为坐标,G(x,y) 表示从 x/y 坐标开始行动可以获取的最大价值
         * 因为有最大的含义, x/y 坐标可以唯一的确定 从本位置开始移动可获得的最大价值,以这两个坐标建立的缓存是有效的
         * 那么尝试定义状态转移方程:
         * G(x,y) = max{ G(x-1,y) , G(x,y-1) } + grid[x][y]
         * x,y 只能从  x-1,y 及 x,y-1 转移过来,该转移过程可以完整覆盖解空间
         * 当 x<0 或者 y<0 时以 0 回归,代表无价值
         */
        public int maxValue(int[][] grid, int x, int y, int[][] cache) {
            if (x < 0 || y < 0) {
                return 0;
            }
            if (cache[x][y] != 0) {
                return cache[x][y];
            }
            int re = Math.max(maxValue(grid, x - 1, y, cache), maxValue(grid, x, y - 1, cache)) + grid[x][y];
            cache[x][y] = re;
            return re;
        }

      效率:

  • 相关阅读:
    Codeforces Global Round 11 E Xum
    【NFLSPC #2】Polynomial
    【SHOI2015】脑洞治疗仪 题解 (线段树)
    CDQ分治与整体二分 学习笔记
    二维树状数组 学习笔记
    博弈论 学习笔记
    【JSOI2007】文本生成器 题解(AC自动机+动态规划)
    【NOI2018】归程 题解(kruskal重构树+最短路)
    【NOI2017】游戏 题解(2-SAT+缩点)
    【BZOJ4398】福慧双修 题解(建图优化)
  • 原文地址:https://www.cnblogs.com/niuyourou/p/12903055.html
Copyright © 2011-2022 走看看