码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 797E 部分dp

时间:2017-07-16 13:40:58      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:log   efi   ref   air   first   font   include   记忆化   有一个   

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\n", cnt);
        }
        else printf("%d\n", solve(p, k));
    }

    return 0;
}

CodeForces 797E 部分dp

标签:log   efi   ref   air   first   font   include   记忆化   有一个   

原文地址:http://www.cnblogs.com/sbfhy/p/7181845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!