楼梯
jzoj 1520
题目大意:
有n个楼梯,跳跃高度初始值是1,当往后一层时,跳跃高度就×2,当跳跃只能跳跃到当前能跳到楼梯,且跳跃之后,跳跃高度变回1,问跳到第n层最少花几步
样例输入
5
0 1 2 3 6
样例输出
7
数据范围限制
2 <= N(楼层数) <= 50
0 <= H[i] (楼层高度)<= 1000000000
提示
提示:
对于30%的数据,N <= 10。
解题思路:
枚举每一步从哪里开始,退后几步,跳到哪里,然后直接DP就行了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll n,a[60],f[60];
int main()
{scanf("%lld",&n);for (ll i=1;i<=n;++i)scanf("%lld",&a[i]);memset(f,0x7f,sizeof(f));f[1]=0;for (ll i=1;i<n;++i)//枚举出发点for (ll j=0;i-j>0;++j)//退后步数for (ll k=i+1;k<=n;++k)//终点if (a[i-j]+(1<<j)>=a[k])//判断f[k]=min(f[i]+j+1,f[k]);//jump!!if (f[n]==f[0]) printf("-1");else printf("%lld",f[n]);
}