迷之阶梯
思路
这道题用dp来做。
设f[i]为走到第i个台阶所用的最短步数,那么方程就是
f
[
i
]
=
m
i
n
(
f
[
i
]
,
f
[
j
]
+
k
+
1
)
;
f[i]=min(f[i],f[j]+k+1);
f[i]=min(f[i],f[j]+k+1);
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long n,a[205],f[205];
int main()
{
scanf("%lld",&n);//读入
memset(f,127/3,sizeof(f));//初始化
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);//读入
f[1]=0;//初始化
for (int i=2;i<=n;i++)
for (int j=i-1;j>=1;j--)
for (long long l=1,k=0;k<j;k++,l*=2)
if (a[j-k]+l>=a[i]) f[i]=min(f[i],f[j]+k+1);//动态转移方程
if (f[n]!=f[0]) printf("%lld",f[n]);//输出
else printf("-1");//如果无法到达输出-1
}