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];
}

京公网安备 11010502036488号