1.问题描述:
小Q正在攀爬一座宝塔,这座宝塔很特别,塔总共有n层,但是两层之间的净高却不相同,所以造成小Q爬过每层的时间也不同。
如果某一次高度为x,那么爬过这一层所需时间也就是x。小Q还会使用一种魔法,每使用一次可以让他向上跳1层或者两层,但是每次调后, 必须至少爬一层才能接着使用魔法。小Q想用最短的时间上顶,希望你能告诉他。
n表示高度(n<=10000)
x表示层差(1<=x<=100)
2.问题分析:
- p[i]表示到达第i层最短时间,并且到达第i层方式是爬
- t[i]表示到达第i层最短时间,并且到达第i层方式是跳
- 情况一:到达第i层的方式是爬
- 那么到达第i-1层的方式可以是跳,也可以是爬,二者选一
- p[i] = Math.min(p[i-1],t[i-1])+x;
- 情况二:到达第i层的方式是跳
- 那么可以从第i-1层起跳,也可以从i-2层起跳,并且到达i-1层和i-2层的方式只能是爬,所以二者选最小的
- t[i] = Math.min(p[i-1],p[i-2]);
3.图示
4.代码
#include<bits/stdc++.h>
using namespace std;
/*
小Q爬塔
*/
int p[10005], t[10005];
int main()
{
int n, x;
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> x;
p[i] = min(p[i-1], t[i-1])+x; //到达第i层的方式是爬
if (i == 1)
{
continue;
}
t[i] = min(p[i-1], p[i-2]); //到达第i层的方式是跳
}
cout << min(p[n], t[n])<< endl;
return 0;
}