动态规划:跳跃游戏

一)跳跃游戏:

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]

二)跳越游戏(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=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];
}
}

你可能感兴趣的:(动态规划,游戏,算法)