题目背景

小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>

题目描述

可是小A很奇怪,他一直在锁妖塔的周围转来转去,可是就是不进去,于是小D问他:”你在干什么?怎么不上去?”小A说:”我在想怎么从锁妖塔外面爬上去”(倒…) 锁妖塔的建造很特别,塔总共有n层,但是高度却不相同,这造成了小A爬过每层的时间也不同.小A会用仙术,每用一次可以让他向上跳一层或两层,但是每次跳跃后小A都将用完灵力,必须爬过至少一层才能再次跳跃(你可以认为小A需要跳两次一层才休息),小A想用最短的时间爬到塔顶,可是他不能找到时间最短的方案,所以请你帮他找到一个时间最短的方案让他爬到塔顶,小A只关心时间,所以你只要告诉他最短时间是多少就可以了.你可以最后跳到塔外即超过塔高.

输入输出格式

输入格式:

 

第一行一个数n (n<=1000000),表示塔的层数.

第二行n个数(<=100),表示从下往上每层的高度.

 

输出格式:

 

一个数,表示最短时间.

 

输入输出样例

输入样例#1:
5
3 5 1 8 4
输出样例#1:
1
 
dp简直是噩梦啊
0 爬到i层 
1 跳1层
2 跳2
#include <cstdio>
#define N 1000005
inline int min(int a,int b)
{
    return a>b?b:a;
}
int f[N][5],n,h[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&h[i]);
    for(int i=1;i<=n;++i)
    {
        f[i][0]=min(f[i-1][0],min(f[i-1][1],f[i-1][2]))+h[i];
        f[i][1]=f[i-1][0];
        f[i][2]=f[i-2][0];
    }
    printf("%d\n",min(f[n][0],min(f[n][1],f[n][2])));
    return 0;
}

 

层 
 
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。