思路
假设f[N]为从i走到 i——i+a[i]的最快速度
初始化:f[1]=0,其它状态初始化为无穷大即可;
状态转移:f[i+a[i]]=min(f[i+a[i]],f[i]+1);
如果a[i]<0,跳过即可。
code
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;
const int N=2010,M=200,mod=1e9+7;
const int INF=0x3f3f3f3f;
typedef pair<ll,ll>pii;
int T;
int n;
int f[N];
int a[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
memset(f,0x3f,sizeof f);
f[1]=0;
for(int i=1;i<=n;i++)
{
if(a[i]<0)continue;
for(int j=i;j<=i+a[i];j++)
{
f[j]=min(f[j],f[i]+1);
}
}
if(f[n]==INF)cout<<-1<<'\n';
else cout<<f[n]<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
T=1;
//cin>>T;
while(T--)solve();
return 0;
}