给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
你的目标是到达最后一个下标,并且使用最少的跳跃次数。
例如:
A = [2,3,1,1,4], 到达最后一个下标的最少跳跃次数为2.(先跳跃1步,从下标0到1,然后跳跃3步,到达最后一个下标。一共两次)
格式:
第一行输入一个正整数n,接下来的一行,输入数组A[n]。
最后输出最少的跳跃次数。
样例输入
5 3 1 1 1 1
样例输出
2
import java.util.Scanner;
public class Main {
public static int n,sum,min;
public static int jump(int A[],int n){//step<span style="font-family:Arial;"><span style="font-size: 14px; line-height: 26px;">[i]表示从本位置到最末尾的最短步数</span></span>
int[] step = new int[n];
<span style="white-space:pre"> </span>step[n-1] = 0;
for (int i = n-2; i >=0; i--) {
if (A[i] == 0)
step[i] = Integer.MAX_VALUE; //第i点不可用
else if (A[i] >= n - i - 1)
step[i] = 1; //从i处可以一步到达最后
else {
int min = Integer.MAX_VALUE;
for (int j = i+1; j < n && //step[i]等于从[i]可触及的地方加一步,即 step[i]=step[i+k]+1 ,1<=k<=A[i]
j <= A[i] + i; j++) {
if (min > step[j])
min = step[j];
}
if (min != Integer.MAX_VALUE)
step[i] = min + 1;
else
step[i] = min;
}
}
return step[0];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
n = in.nextInt();
sum=0;;min=n-1;
int[] A = new int[1000];
int i;
for(i=0;i<n;i++)
A[i]=in.nextInt();
int step = jump(A,n);
System.out.println(step);
}
}