又是超级水的一题,一道线性DP。

这几道DP很简单,分成很多篇文章发可以假装自己的博客写了很多文章~

又上锁妖塔(tower.pas/c/cpp)

洛谷题目提交地址:又上锁妖塔

题目描述

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

第一行一个数n(n≤10000),表示塔的层数。
接下来的n行每行一个数(≤100),表示从下往上每层的高度。

一个数,表示最短时间。

5
3
5
1
8
4
1

对20%的数据:n≤10;
对40%的数据:n≤100;
对60%的数据:n≤5000;
对100%的数据:n≤10000;

显然这题是DP,线性DP。直接F[i]定义不行,因为上次的是否用仙术这一决策会影响这一次的决策。那么我们自然想到定义F[i][0/1]表示到达第i层所用最短时间,0表示上次是飞过来的,1表示上次是爬过来的。那么显然转移方程就是:

F[i][0]=min(F[i-1][1],F[i-1][0])+t[i];
F[i][1]=min(F[i-1][1],F[i-2][1]);

时间复杂度O(N)!