这一道题也是一道
,只需要三重循环
1.枚举现在在哪一阶
2.枚举从哪一阶来的
3.枚举退后了多少阶
其余
#include<cstdio>
#include<iostream>
using namespace std;
long long a[205],f[205],t=1;
int n;
int main()
{
scanf("%d",&n);
for(int i=0; i<=n; ++i)
f[i]=1<<29;//手动赋初值
for (int i=1; i<=n; ++i)
scanf("%lld",&a[i]);
f[1]=0;
for (int i=2; i<=n; ++i)//枚举当前级数
for (int j=i-1; j>=1; --j)//枚举从哪来
for (long long t=1,k=0; k<j; ++k,t*=2)//枚举退后了多少阶
if (a[j-k]+t>=a[i]) f[i]=min(f[i],f[j]+k+1);//找一个最小值
if (f[n]!=f[0]) printf("%lld",f[n]);//看是否改变值了
else printf("-1");
}