一)跳跃游戏:
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]的值就是truedp[i]=true;break;}}}return dp[0];} }
三)初始化+填表顺序+返回值
填表顺序:从左向右,初始化为dp[array.length-1]=true,返回值是dp[0]
二)跳越游戏(2)
45. 跳跃游戏 II - 力扣(LeetCode)
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]; } }