• CodeForces 797E 部分dp


    CodeForces 797E

    题意:给出 n个数的数组 a[],有 q个询问,每次询问有 p,k。有一个操作:把 p变为 p+a[p]+k。 对于每个询问输出要多少次操作才能令 p>n。

    tags:一开始感觉就是dp,但直接搞肯定超时。注意到,k很大的情况,p的增长是很快的。所以,算一下复杂度可以发现,在 k>350时,直接暴力即可; k<=350时,dp记忆化搜索。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 100005;
    
    int dp[N][351], n, q, a[N], p, k;
    int solve(int p, int k)
    {
        if(p>n) return 0;
        if(dp[p][k]!=0) return dp[p][k];
        return dp[p][k]=solve(p+a[p]+k, k)+1;
    }
    int main()
    {
        scanf("%d", &n);
        rep(i,1,n) scanf("%d", &a[i]);
        scanf("%d", &q);
        rep(i,1,q)
        {
            scanf("%d %d", &p, &k);
            if(k>350)
            {
                int cnt=0;
                while(p<=n) p=p+a[p]+k, ++cnt;
                printf("%d
    ", cnt);
            }
            else printf("%d
    ", solve(p, k));
        }
    
        return 0;
    }
  • 相关阅读:
    mem 预留内存
    关于内核反汇编,同时显示源文件
    读些笔记
    platform设备驱动
    glut 右键子菜单
    获取HINSTANCE
    window窗口样式style
    opengl 直线拾取
    glut弹出式菜单
    读取大恒采集卡c++代码
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7181845.html
Copyright © 2020-2023  润新知