袋鼠过河问题
来源:互联网 发布:如何做好业务员知乎 编辑:程序博客网 时间:2024/05/01 15:32
题目描述
一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1
输入描述:
输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出描述:
输出最少的跳数,无法到达输出-1
**示例1
输入**
5
2 0 1 1 1
输出
4
提供两种解决方式:
1、暴力解决,从第一个桩出发,通过判断其最大跳至的下一桩是否为0,若为0,则进行次大跳,当不为0时,继续跳桩,当最大跳减至0,返回-1,无解。
2、动态规划,通过河宽和a[i]的比较判断是否取至第i桩的最小跳数,其始桩数为1,跳数为1,当出现弹力达不到比较宽度时,返回-1。
具体上代码:
public static void main(String[] args) { // TODO code application logic here Scanner scan = new Scanner(System.in); int len = scan.nextInt(); int[] a = new int[len]; for (int i = 0; i < len; i++) { a[i] = scan.nextInt(); } System.out.println(game(a)); scan.close(); }// private static int game(int[] a) { //暴力解决,运行超时// int count = 0;// if (a[0] == 0) {// return -1;// } else {// for (int i = 0; i < a.length;) {// count++;// while(a[i]==0&&i>0){// i=i-1;// }// i = i + a[i];// }// }// return count;// } private static int game(int[] a) { //动态规划 int res=0; int[] b=new int[a.length+1]; for(int i=1;i<=a.length;i++){ int temp=Integer.MAX_VALUE; for(int j=0;j<i;j++){ if(b[j]!=-1&&a[j]>=i-j){ temp=Math.min(temp, b[j]+1); //判断是否到达宽度并与前一桩的最小跳数比较,取最小值 } if(temp==Integer.MAX_VALUE){ b[i]=-1; }else{ b[i]=temp; } } } return b[a.length]; }}
阅读全文
0 0
- 袋鼠过河问题
- 袋鼠过河问题(DP)
- 袋鼠过河
- 袋鼠过河
- 动态规划之袋鼠过河问题
- 利用贪心算法计算袋鼠过河问题
- 搜狐笔试题目一袋鼠过河
- 袋鼠蹦蹦跳问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- 过河问题
- [Python][Scrapy] Scrapy 官方文档
- 欢迎使用CSDN-markdown编辑器
- 经典的字符串模式匹配算法KMP算法
- 将本地项目上传到git
- Linux字符设备原理探究--1
- 袋鼠过河问题
- Mockito 学习篇(二)
- Flask零基础到项目实战(三)Jinja2模板系统 (二)
- javaScript基本语法入门
- Python学习笔记——__slots__
- 微信QQ附近好友雷达扫描
- ZOJ 3329 One Person Game (期望DP)
- Python网络爬虫基础
- 8-27 DAIRY