迷之階梯 ladder

2021-08-21 18:33:30 字數 1319 閱讀 4057

問題描述:

在經過地球防衛小隊的數學家連續多日的工作之後,外星人發的密碼終於得以破解。它 告訴我們在地球某一處的古老遺跡中,存在有對抗這次災難的秘密道具。防衛小隊立刻派出 了乙個***小分隊,迅速感到了這處遺跡。要進入遺跡,需要通過一段迷之階梯。登上階 梯必須要按照它要求的方法,否則就無法登上階梯。它要求的方法有以下三個限制:

1. 如果下一步階梯的高度只比當前階梯高 1,則可以直接登上。

2. 除了第一步階梯外,都可以從當前階梯退到前一步階梯。

3. 當你連續退下 k 後,你可以一次跳上不超過當前階梯高度 2^k 的階梯。比如說你現 在位於第 j 步階梯,並且是從第 j + k 步階梯退下來的。那麼你可以跳到高度不超過當前階 梯高度 + 2^k 的任何一步階梯。跳躍這一次只算一次移動。

開始時你在第 1 步階梯。由於時間緊迫,我們需要你預先計算出登上迷之階梯的最少移 動次數。

輸入格式:

第 1 行:乙個整數 n,表示階梯步數;

第 2 行:n 個整數(每兩個之間有 1 個空格),依次為每層階梯的高度,保證遞增。

輸出格式:

輸出一行乙個整數,如果能登上階梯,輸出最小步數,否則輸出-1。

輸入樣例:

5 0 1 2 3 6

輸出樣例:7

樣例解釋:

連續凳 3 步,再後退 3 步,然後直接跳上去。

資料限制: 對於 50%的資料:1 <= n <= 20;

對於 100%的資料:1 <= n <= 200;每步階梯高度不超過 2^31-1。

dp#include

using namespace std;

long long dp[100005];

long long a[100005];

long long ksm(long long x,long long k)

return n;

}int main()

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

dp[1]=0;

if((a[2]-a[1])==1)

dp[2]=1;

else 

for(int i=3;i<=n;i++)}}

if((a[i]-a[i-1])==1)dp[i]=min(dp[i-1]+1,dp[i]);

}if(dp[n]==999999999)

cout<<-1;

else

cout

}

2017 8 8測試 題四 迷之階梯

題解 本題是動態規劃,不過不同往常的是它還會往後退,向前跳。所以,當前階梯可能是從前面的退k步過來的,或從後面跳過來的 動態轉移方程 min f i j j 1,f k var a,f array 0.200 of longint c array 0.31 of int64 n,i,j,k long...

SDUT 迷之好奇

include include int top struct node st 5001000 int creat void insertt int root,char s st root flag root st root next t int cmp char s,int root root st...

貪心之迷瘴

迷瘴 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 通過懸崖的yifenfei,又面臨著幽谷的考驗 幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日...