洛谷 P1929 迷之阶梯

题目传送门

解题思路:

f[i]表示跳到第i层的最少移动次数,如果可以从下面一级跳上来,那么直接跳上来,如果跳不上来,那就往后退,退到不能退或能跳上第i层

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 
 8 int n,a[201],f[201]; 
 9 
10 int main() {
11     memset(f,0x3f3f3f,sizeof(f));
12     scanf("%d",&n);
13     for(int i = 1;i <= n; i++)
14         scanf("%d",&a[i]);
15     f[1] = 0;
16     for(int i = 2;i <= n; i++) {
17         if(a[i] == a[i-1] + 1) f[i] = f[i-1] + 1;
18         for(int j = 1;j <= i - 1; j++)
19             for(int k = 1;k < i - j; k++)//枚举退到哪里可以跳上去 
20                 if(a[j] + (int)pow(2,k) >= a[i])//可以跳上去了 
21                     f[i] = min(f[i],f[j+k] + k + 1);
22     }
23     if(f[n] >= 1061109567) printf("-1");
24     else
25         printf("%d",f[n]);
26     return 0;
27 }

猜你喜欢

转载自www.cnblogs.com/lipeiyi520/p/12375160.html