1 条题解

  • 1
    @ 2022-08-27 23:14:48
    #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

信息

ID
1590
难度
5
分类
动态规划 点击显示
标签
递交数
3
已通过
1
通过率
33%
上传者