对于每一个位置,枚举跳上来的高度,通过枚举指数K来实现,然后状态转移
#include<bits/stdc++.h>
#define maxn 210
using namespace std;
inline void read(int &x)
{
int y=1;
x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
x=x*y;
}
int n;
int h[maxn];
int opt[maxn];
int main()
{
read(n);
for(int i=1;i<=n;i++)read(h[i]);
memset(opt,0x3f,sizeof(opt));
opt[1]=0;
for(int i=2;i<=n;i++)
{
int nh=h[i],jump=1,j=i-1;
for(int k=0;nh-jump/2>=0;k++,jump*=2)
{
for(;j-k>0;--j)
{
if(h[j-k]+jump<nh)break;
opt[i]=min(opt[i],opt[j]+k+1);
}
}
opt[i-1]=min(opt[i-1],opt[i]+1);
}
if(opt[n]==0x3f3f3f3f)printf("-1\n");
else printf("%d\n",opt[n]);
return 0;
}