1 条题解
-
0Guest LV 0 MOD
-
1
#include<bits/stdc++.h> const int N=30005; int a[30005],f[30005]; int t,n; int main() { freopen("river.in","r",stdin); freopen("river.out","w",stdout); scanf("%d", &t); while (t--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); memset(f,-1,sizeof f);//先全部赋值 -1 f[0]=0;//第 1 个为 0 for(int i=0; i<=n; i++)//开始枚举 { if(f[i]==-1)//都走不通了,这种方法不行,退出 continue; for(int j=1; j<=a[i]&&i+j<=n/*不能越界*/; j++)//j 表示在 a_i 的跳跃能力下,可以跳到 i+1~i+a_i 的位置,开始枚举 { if(f[i+j]==-1||f[i+j]>=f[i]+1)//一旦没跳过或者有更优的方法 f[i+j]=f[i]+1;//替换掉,次数++ } } printf("%d\n",f[n]);//输出目标值 } return 0; }
- 1