跳跃的数字2(动态规划实现)

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

你的目标是到达最后一个下标,并且使用最少的跳跃次数。

例如:

A = [2,3,1,1,4]A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 22。(先跳跃 11 步,从下标 00 到 11,然后跳跃 33 步,到达最后一个下标。一共两次)

输入格式

第一行输入一个正整数 n(1 \le n \le 100)n(1n100) ,接下来的一行,输入 nn 个整数,表示数组 AA

输出格式

最后输出最少的跳跃次数。

样例输入
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]);
	
	
}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值