問題描述:
在經過地球防衛小隊的數學家連續多日的工作之後,外星人發的密碼終於得以破解。它 告訴我們在地球某一處的古老遺跡中,存在有對抗這次災難的秘密道具。防衛小隊立刻派出 了乙個***小分隊,迅速感到了這處遺跡。要進入遺跡,需要通過一段迷之階梯。登上階 梯必須要按照它要求的方法,否則就無法登上階梯。它要求的方法有以下三個限制:
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 } 題解 本題是動態規劃,不過不同往常的是它還會往後退,向前跳。所以,當前階梯可能是從前面的退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... 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,又面臨著幽谷的考驗 幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日...2017 8 8測試 題四 迷之階梯
SDUT 迷之好奇
貪心之迷瘴