1.小Q爬塔
【问题描述】小Q正在攀爬一座宝塔,这座宝塔很特别,塔总共有n层,但是两层之间的净高却不相同,所以造成小Q爬过每层的时间也不同。如果某一次高度为x,那么爬过这一层所需时间也就是x。小Q还会使用一种魔法,每使用一次可以让他向上跳1层或者两层,但是每次跳后,必须至少爬一层才能接着使用魔法。(你可以认为小Q需要跳两次一层才休息,最后也可以跳到塔外即超过塔高,跳事不消耗时间的)小Q想用最短的时间上顶,希望你能告诉他最短时间是多少?
输入描述:
第一行一个数n(n<=10000),表示从下往上每层的高度。
接下来的n行每行一个数h(1<=h<=100),表示从下往上每层的高度。
输出描述:
一个数,表示最短时间
输入样例:
5
3
5
1
8
4
输出样例:
1
————————————————
1.2图解描述
1.3思路分析
变量:
p[i]表示到达当前第i层的最短时间,并且到达第i层的方式是爬
t[i]表示到达当前第i层的最短时间,并且到达第i层的方式是跳
必须判断到达当前第i层的方式采用爬还是跳
情况1:到达当前第i层的方式是爬:
那么到达第i-1层的方式可以是爬也可以是跳,从俩者中选择最小
p[i]=min{p[i-1],t[i-1]}+a[i]
情况2:到达当前第i层的方式是跳:
那么可以从第i-1层起跳,也可以从第i-2层起跳。并且到达第i-1层和第i-2层的方式只能选爬(到第i层是跳),所以在俩者中选择最小
t[i]=min{p[i-1],p[i-2]}
最后在p[n]和t[n]中选最小者做结果
1.4代码实现
import java.util.Scanner;
public class Tc1 {
public static void main(String[] args) {
//设置俩个时间数组,每一个元素存储的是经过之前层所需的最短时间
int[] p=new int[10005];//p[i]表示到达当前第i层的最短时间,并且到达第i层的方式是爬
int[] t=new int[10005];//t[i]表示到达当前第i层的最短时间,并且到达第i层的方式是跳
int n,x;
Scanner scanner=new Scanner(System.in);
System.out.print("输入样例:");
n=scanner.nextInt(); //输入层数
for(int i=1;i<=n;i++) { //遍历每一层,i既是层数又是角标
x=scanner.nextInt(); //输入每一层的高度
p[i]=Math.min(p[i-1], t[i-1])+x; //到达第i层的方式是爬
if(i==1) continue; //至少跳一层才能跳跃
t[i]=Math.min(p[i-1], p[i-2]); //到达第i层的方式是跳跃
}
System.out.println("最短时间为:"+Math.min(p[n], t[n]));//俩种情况的最小值
}
}