题目传送门
解题思路:
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 }