dp[i]表示到达第i级台阶所需的步数;
判断是否有解的时候,那个数值要大一点。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=500;
const int inf=0x3f;
int n,dp[maxn],height[maxn];
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>height[i];
    memset(dp,inf,sizeof(dp));dp[1]=0;
    for(int i=1;i<=n;i++)
    {
       if(height[i+1]-height[i]==1) dp[i+1]=min(dp[i+1],dp[i]+1);//第一种,如果相邻两个==1,则可以直接上一台阶
       dp[i-1]=min(dp[i-1],dp[i]+1);//第二种情况
       for(int k=1;k<i;k++)//第三种情况,枚举退的步数
       {
           int h=(1<<k)+height[i-k];//最大高度
           for(int j=i-k;height[j]<=h&&j<=n;j++)//height<h的数
           {
                dp[j]=min(dp[i]+1+k,dp[j]);
           }
       }
    }
    if(dp[n]>=1e8) cout<<-1;
    else cout<<dp[n];
}