SkyWT / 博客 / 动态规划经典题目(二):又上锁妖塔

动态规划经典题目(二):又上锁妖塔

2018 年 1 月 21 日 12:49


又是超级水的一题,一道线性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)!

暂无评论


发表新的评论

所有评论都将经过博主审核。请勿填写无意义邮箱或发表无关评论、广告等,否则会被视为垃圾评论。

提交评论即表明你同意本网站使用 Cookie,并允许本站在后台记录你的邮箱、IP 地址等必要信息。
(提交一次评论后,本提示将不再展示)