首页 > 其他分享 >[LeetCode] 1440. Jump Game V 跳跃游戏之五

[LeetCode] 1440. Jump Game V 跳跃游戏之五

时间:2023-04-14 13:23:23浏览次数:56  
标签:index arr res jump 位置 Jump Game 之五 memo


Given an array of integers arr and an integer d. In one step you can jump from index i to index:

  • i + x where: i + x < arr.length and  0 < x <= d.
  • i - x where: i - x >= 0 and  0 < x <= d.

In addition, you can only jump from index i to index j if arr[i] > arr[j] and arr[i] > arr[k] for all indices k between i and j (More formally min(i, j) < k < max(i, j)).

You can choose any index of the array and start jumping. Return the maximum number of indices you can visit.

Notice that you can not jump outside of the array at any time.

Example 1:

Input: arr = [6,4,14,6,8,13,9,7,10,6,12], d = 2
Output: 4
Explanation: You can start at index 10. You can jump 10 --> 8 --> 6 --> 7 as shown.
Note that if you start at index 6 you can only jump to index 7. You cannot jump to index 5 because 13 > 9. You cannot jump to index 4 because index 5 is between index 4 and 6 and 13 > 9.
Similarly You cannot jump from index 3 to index 2 or index 1.

Example 2:

Input: arr = [3,3,3,3,3], d = 3
Output: 1
Explanation: You can start at any index. You always cannot jump to any index.

Example 3:

Input: arr = [7,6,5,4,3,2,1], d = 1
Output: 7
Explanation: Start at index 0. You can visit all the indicies.

Constraints:

  • 1 <= arr.length <= 1000
  • 1 <= arr[i] <= 105
  • 1 <= d <= arr.length

这道题是 Jump Game 系列的第五道题,跳跃的方式是这样的,给了一个数组 arr,里面的数字代表高度,还有一个整型数d,表示一次跳跃的最远距离,在任意一个位置可以往左右两个方向跳跃,但是跳跃经过的位置必须都低于起跳位置,且距离不能超过d,现在说是可以从任意位置起跳,让返回最多可以到达的不同位置的数量。既然要找最多的不同位置的数量,而且起跳点又不固定,则肯定是要计算所有情况的,即每个点都要充当起跳点。又因为没有整体跳跃总数的限制,则跳到一个新的位置之后,从该位置开始起跳能到达的位置个数,跟以该位置为起跳点能到达的位置个数相同,这是因为每次都是从高点往低点跳,新的跳跃位置不会跟之前的重复。那么为了避免重复计算,最好可以用一个数组来记录以任意点为起跳点可以到达的位置总数,这里使用一个一维数组 memo,其中 memo[i] 表示以位置i为起跳点,可以到达的位置总数。

由于需要以每个位置都当作起跳点,则可以遍历整个数组,对于每个位置都计算一下可以到达位置的总数,为了方便起见,用一个递归函数来计算,在每个位置计算后返回的值中取最大的,就是题目所求了。现在来看递归函数的实现,由于前面定义了 memo 数组,则对于给定的起跳位置i,首先去 memo 数组中查看,若有值,则说明之前计算过,直接返回其值即可。否则需要另行计算,计算方法也不难,先往右边遍历,不能超过距离限制d,也不能越右边界,对于新跳到的位置,再次调用递归函数,则可以用1加上递归函数的返回值来更新结果 res。同理,再往左遍历,不能超过距离限制d,不能越左边界,对于新跳到的位置,再次调用递归函数,则可以用1加上递归函数的返回值来更新结果 res。这样,最终得到的结果 res 就是以位置i为起跳点,最多可以到达的位置总数了,将其赋值给 memo[i],并返回即可,参见代码如下:


class Solution {
public:
    int maxJumps(vector<int>& arr, int d) {
        int res = 1, n = arr.size();
        vector<int> memo(1001);
        for (int i = 0; i < n; ++i) {
            res = max(res, dfs(arr, d, i, memo));
        }
        return res;
    }
    int dfs(vector<int>& arr, int d, int i, vector<int>& memo) {
        if (memo[i]) return memo[i];
        int res = 1, n = arr.size();
        for (int j = i + 1; j <= min(i + d, n - 1) && arr[j] < arr[i]; ++j) {
            res = max(res, 1 + dfs(arr, d, j, memo));
        }
        for (int j = i - 1; j >= max(0, i - d) && arr[j] < arr[i]; --j) {
            res = max(res, 1 + dfs(arr, d, j, memo));
        }
        return memo[i] = res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1340


类似题目:

Jump Game

Jump Game II

Jump Game III

Jump Game IV

Jump Game VI

Jump Game VII

Jump Game VIII


参考资料:

https://leetcode.com/problems/jump-game-v/

https://leetcode.com/problems/jump-game-v/solutions/496520/top-down-dp-o-nd/

https://leetcode.com/problems/jump-game-v/solutions/496719/c-top-down-dp-memoization/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:index,arr,res,jump,位置,Jump,Game,之五,memo
From: https://www.cnblogs.com/grandyang/p/17317999.html

相关文章

  • POJ 1753 Flip Game (高斯消元)
    题目地址:POJ1753第三次做这道题了。第一次是刚学搜索的时候做的,第二次是刚学状态压缩枚举的时候做的,这次是刚学高斯消元、、每次都做得很艰辛。。目测这题应该没了别的方法了吧。。。。。。这题除了高斯消元外还需要枚举变元,方法是状态压缩枚举,然后返回去迭代解方程。代码如下:#inc......
  • 一文读懂使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
    前言:​ 今天接了一个单子要求写一个基于pygame的贪吃蛇小游戏,打包成.exe文件。下面我就来教大家来python怎么打包文件,希望大家阅读这篇文章之后有所收获。下面看下通过Pyinstaller打包Pygame库写的小游戏程序出现的问题解决方法开发环境:Python:3.5.464位pyinstall:3.3.1一......
  • POJ 1753 Flip Game(bfs枚举+递推)
    题目地址:http://poj.org/problem?id=1753这题此前曾经做过,但当时是用的纯BFS做的,然后后来又做了一次组队赛,那是16*16的,果断超时超内存。。能超的都超了。。于是又找了个更好的方法,就是枚举第一行,然后后面的根据第一行的情况推下去。比如,你要让所有的都变成W,如果上一行的对应位置是B......
  • GAMES101笔记-01
    前言:这篇以及未来的一系列随笔是根据b站上的GAMES101现代计算机图形学入门课程所写的笔记,但笔记的篇章并非和课程一一对应。比如这篇对应的是第二课~第三课的内容。并且整理时不一定会将推导过程全部列出,做成只有总结概括的内容也不是没有可能。 1.向量叉乘的矩阵表示:  ......
  • 通过MenuItem在场景中生成GameObject
    MenuItemAttribute允许你在主菜单中添加新的选项。而这个菜单选项来自于一个静态函数。publicclassTestMenuItem{//Createsanewmenuitem'Examples>CreatePrefab'inthemainmenu.[MenuItem("TestMenuItem/CreatePrefab")]staticvoidCreatePrefa......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • JumpGame
    packageDynamicPlanning;/***55.跳跃游戏*给定一个非负整数数组nums,你最初位于数组的第一个下标。*数组中的每个元素代表你在该位置可以跳跃的最大长度。*判断你是否能够到达最后一个下标。*//***设想一下,对于数组中的任意一个位置y,我们如何判断它是......
  • 性能工具之Jmeter小白入门系列之五
    专气致柔,能如婴儿乎---《道德经》第十章一、Jmeter命令行启动   Jmeter有两种运行:一种是采用的界面模式(GUI)启动,会占用不少系统资源;另一种是命令行模式(non-GUI)执行,这样节约资源,在性能测试,基本都是按这种方式运行。启动命令:jmxfileresultsfile :结果保存文件类型......
  • docker部署jumpserver
     关闭selinux[root@centos7~]#setenforce0[root@centos7~]#systemctlstopfirewalld[root@centos7~]#iptables-F安装docker源[root@centos7~]#yum-yinstallwget[root@centos7~]#cd/etc/yum.repos.d/[root@centos7~]#wgethttps://mirrors.aliyun.com/docker......
  • jump server服务器安装anaconda和虚拟环境
      两次cd..然后suxingming(这个姓名就是自己的账号)然后输入cd~然后联网,输入bashlogin然后联网成功后,输入ls查看当前文件下有哪些文件   比如我要删除这个文件夹下的yes文件,输入pwd查看当前路径:/data00/mabaoguo(姓名)然后输入sudorm-rf/data00/maba......