一、题目(存在型动态规划)
输入:石头总数n
每个石头可向右跳跃的步数dis
输出:YES 或 NO 表是否能从石头0到达石头n-1
例如:
输入:5
2 3 1 1 4
输出:YES
二、分析
三、代码
import java.util.Scanner;
public class Main {
/*
测试数据
* */
static int[] dp; //dp[i]表示能否跳到石头i,1表示可以
static int[] dis; //dis[i]表示在石头i上最多可向右跳的步数
static int n;//石头总数
public static void main(String[] args){
//1.输入相关数据
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dis = new int[n];
dp = new int[n];
for(int i=0;i<n;i++) {
dis[i] = sc.nextInt();
}
//2.初始化dp数组的值
dp[0]=1;
//3.设置dp数组的值
setDp();
//4.输出dp[n-1]
if(dp[n-1]==1) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
private static void setDp() {
for(int i=1;i<dp.length;i++) {
dp[i]=0;//初始为0
for(int j=0;j<i;j++) {//枚举石头i之前的石头j(判断能否从石头j跳到石头i)
if(dp[j]==1 && (i-j)<=dis[j]) {//能够跳到石头j,并且可以从石头j跳到石头i,即石头j到石头i的距离<=从石头j可以跳跃的距离
dp[i]=1;
}
}
}
}
}