古老的牛市,遗迹的天梯
古老的牛市,遗迹的天梯
https://ac.nowcoder.com/acm/contest/5968/A
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]; }