一)跳跃游戏:
55. 跳跃游戏 - 力扣(LeetCode)
一)定义一个状态表示:
dp[i]表示以i未知元素为起点,是否能够到达最后一个位置
二)根据状态表示推到状态转移方程:根据最近的一步来进行划分问题
我们可以从当前i位置向后走j步,看看从i+j的位置是否能够到达最后一个位置,那么就说明从i位置可以到达i+j位置,从i+j位置可以到达最后一个位置,那么就是说明从i位置是可以到达最后一个位置的
class Solution { public boolean canJump(int[] nums) { //dp[i]表示以i位置为起点,是否能够到达最后一个位置 boolean[] dp=new boolean[nums.length]; dp[nums.length-1]=true; for(int i=nums.length-2;i>=0;i--){ for(int j=0;j<=nums[i];j++){ if(dp[i+j]==true){ //只要能够保证后面有一个值可以跳跃到array.length-1的位置,dp[i]的值就是true dp[i]=true; break; } } } return dp[0]; } }
三)初始化+填表顺序+返回值
填表顺序:从左向右,初始化为dp[array.length-1]=true,返回值是dp[0]文章来源:https://www.toymoban.com/news/detail-603608.html
二)跳越游戏(2)
45. 跳跃游戏 II - 力扣(LeetCode)文章来源地址https://www.toymoban.com/news/detail-603608.html
class Solution { public int jump(int[] nums) { //dp[i]表示以i位置为起点,是否能够到达最后一个位置的下标 boolean[] dp=new boolean[nums.length]; int[] g=new int[nums.length]; //g[i]表示以i位置元素为开始,到达元素末尾的最小次数 for(int i=0;i<g.length;i++){ g[i]=Integer.MAX_VALUE; } dp[nums.length-1]=true; g[nums.length-1]=0; for(int i=nums.length-2;i>=0;i--){ //分为两种情况,从i位置有直接能力开始直接跳转到最后一个位置 if(nums[i]>=nums.length-1){ g[i]=1; dp[i]=true; continue; } //再分为一种情况,从i位置先跳转到j位置,再求从j位置到达结尾的最小次数 for(int j=1;j<=nums[i];j++){ if(i+j<=nums.length-1&&dp[i+j]==true){ dp[i]=true; g[i]=Math.min(g[i],g[i+j]+1); } } } System.out.println(Arrays.toString(g)); return g[0]; } }
到了这里,关于动态规划:跳跃游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!