给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
你的目标是到达最后一个下标,并且使用最少的跳跃次数。
例如:
A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2。(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标。一共两次)
输入格式
第一行输入一个正整数 n(1≤n≤100) ,接下来的一行,输入 n 个整数,表示数组 A。
输出格式
最后输出最少的跳跃次数。
样例输入
5 3 1 1 1 1
样例输出
2
解题思路:这道题目是一个动态规划的问题,主要因为子问题可以分解,子问题的最优解同时被问题所包括。那么状态转移方程就是
dp[n]=min{dp[n-j]+1,j属于a[a.length-1-n]值的返回内,同时不能越界},首先dp[0]=0,dp[0]代表a[a.length-1]的最小跳跃次数,一次类推,从右到左,最终,dp[a.length-1]就是从数组头到尾的最小跳跃次数了
源代码如下:
import java.util.Scanner; public class Main{ public static int[] min(int []a){ int dp[]=new int[a.length]; for(int i=0;i<a.length;i++){ dp[i]=a.length; } dp[0]=0; for(int i=1;i<a.length;i++){ /* if(i==a.length-1){ System.out.println(a[a.length-1-i]); }*/ int maxjump=a[a.length-1-i];//最大的跳跃 // System.out.println(maxjump); int temp=maxjump<i?maxjump:i;//与数组尾巴的距离取小者。 for(int j=temp;j>0;j--){ if(dp[i]>dp[i-j]+1){ dp[i]=dp[i-j]+1; } } } return dp; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); int len= sc.nextInt(); int a[]=new int[len]; for(int i=0;i<len;i++){ a[i]=sc.nextInt(); } // int a[]={3,1,2,1,1}; int []dp= min(a); System.out.println(dp[a.length-1]); } }