92 跳跃游戏
Table of Contents

ac

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] arr = new int[n];

        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        int[] dp = new int[n];
        for(int i=1;i<n;i++){
            int minStep = Integer.MAX_VALUE;
            // 前面的位置都可能到达位置i
            for(int j=0;j<i;j++){
                if(j + arr[j] >= i){
                    minStep = Math.min(minStep, dp[j] + 1);
                }
            }
            dp[i] = minStep;
        }
        int ans = dp[n-1];
        System.out.println(ans);
    }

}
/*
6
3 2 3 1 1 4

2

arr[0]==3,选择跳到位置2,arr[2]==3,可以跳到最后的位置。所以返回2。
 */

当i < j 的时候,一定有dp[i] < dp[j],即前面位置的走到所需要的步数肯定小于后面的位置,因为
arr[i]==k代表可以从位置向右跳1~k个距离。比如,arr[2]==3,代表可以从位置2跳到位置3、位置4或位置5。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] arr = new int[n];

        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        int[] dp = new int[n];
        for(int i=1;i<n;i++){
            int minStep = Integer.MAX_VALUE;
            // 前面的位置都可能到达位置i
            for(int j=0;j<i;j++){
                if(j + arr[j] >= i){
                    minStep = Math.min(minStep, dp[j] + 1);
                    break;
                }
            }
            dp[i] = minStep;
        }
        int ans = dp[n-1];
        System.out.println(ans);
    }

}
/*
6
3 2 3 1 1 4

2

arr[0]==3,选择跳到位置2,arr[2]==3,可以跳到最后的位置。所以返回2。
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        int[] dp = new int[n];
        int[] cands = new int[n];
        for(int i=1;i<n;i++){
            int minStep = Integer.MAX_VALUE;
            int pos = -1;
            // 前面的位置都可能到达位置i
            for(int j=cands[i-1];j<i;j++){
                if(j + arr[j] >= i){
                    minStep = Math.min(minStep, dp[j] + 1);
                    pos = j;
                    break;
                }
            }
            dp[i] = minStep;
            cands[i] = pos;
        }
        int ans = dp[n-1];
        System.out.println(ans);
    }

}
/*
6
3 2 3 1 1 4

2

arr[0]==3,选择跳到位置2,arr[2]==3,可以跳到最后的位置。所以返回2。
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        int step = 0;
        int cur = 0; // 当前用step步数能走到的最远位置
        int next = arr[0];
        for(int i=1;i<n;i++){
            if(cur < i){
                // 必须多走一步
                step++;
                cur = next;
            }
            // 对每个i,都求了一次能到达都最远位置
            next = Math.max(next, i + arr[i]);
        }
        int ans = step;
        System.out.println(ans);
    }
}
/*
6
3 2 3 1 1 4

2

arr[0]==3,选择跳到位置2,arr[2]==3,可以跳到最后的位置。所以返回2。
 */