9月22日 又上鎖妖塔

2022-08-26 04:51:10 字數 1077 閱讀 6956

題目

題目描述

小d在x星買完了想要的東西,在飛往下乙個目的地的途中,正無聊的他轉頭看了看身邊的小a,發現小a正在玩《仙劍》,可是小a很奇怪,他一直在鎖妖塔的周圍轉來轉去,可是就是不進去,於是小d問他:」你在幹什麼?怎麼不上去?」小a說:」我在想怎麼從鎖妖塔外面爬上去」(倒…) 鎖妖塔的建造很特別,塔總共有n層,但是高度卻不相同,這造成了小a爬過每層的時間也不同.小a會用仙術,每用一次可以讓他向上跳一層或兩層,但是每次跳躍後小a都將用完靈力,必須爬過至少一層才能再次跳躍(你可以認為小a需要跳兩次一層才休息),小a想用最短的時間爬到塔頂,可是他不能找到時間最短的方案,所以請你幫他找到乙個時間最短的方案讓他爬到塔頂,小a只關心時間,所以你只要告訴他最短時間是多少就可以了.你可以最後跳到塔外即超過塔高.

樣例解釋

輸入第一行乙個數n (n<=10000),表示塔的層數.

接下來的n行每行乙個數(<=100),表示從下往上每層的高度.

輸出乙個數,表示最短時間

輸入樣例複製53

5184

輸出樣例複製1說明

對20%的資料,n<=10 對40%的資料,n<=100 對60%的資料,n<=5000 對100%的資料,n<=10000

分析首先我們設f[i][0]為第i層是爬上來的,f[i][1]表示第i層是飛上來的

因為到達一層有兩種方案

於是得到狀態轉移方程

f[i][1]=min(f[i-1][0],f[i-1][1])+原來當前樓層的高度;

f[i][0]=min(f[i-1][1],f[i-2][1]);//有兩種飛的方案,一層和兩層

**

#include using

namespace

std;

int f[20001][2],t[20001

];int min(int x,int

y)int

main()

int ans=0x7fffffff

;

for (int i=n;i<=n+2;i++)

printf(

"%d\n

",ans);

return0;

}

P2800 又上鎖妖塔

看,題面被吃掉了!這道題是一道經典的dp,難點在於怎樣列狀態轉移方程。首先,我們要將原問題 爬到第n層的最小時間 分解成若干個子問題。我在分解子問題的時候遇到了一點點小困難。題目限制不能連續飛躍,因此怎樣定義狀態是解題的關鍵 我們定義f i 表示到達第i層的時候爬上去的最大值 因此我們很容易地找到它...

P2800 又上鎖妖塔 dp

傳送門 思路 仙劍啊 必須有題解!思路 一道動態規劃題,你可以有三種選擇,跳一層,二層,或花費時間爬一層。所以每次在這三種狀態裡選擇最小的即可。相似題型 美元匯率 from qingdao agricultural university created by xiangwangacmer date ...

動態規劃 RQ82 又上鎖妖塔

小d在x星買完了想要的東西,在飛往下乙個目的地的途中,正無聊的他轉頭看了看身邊的小a,發現小a正在玩 仙 劍 可是小a很奇怪,他一直在鎖妖塔的周圍轉來轉去,可是就是不進去,於是小d問他 你在幹什麼?怎麼不上去?小a說 我在想怎麼從鎖妖塔 外面爬上去 倒 鎖妖塔的建造很特別,塔總共有n層,但是高度卻不...