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

codeforces 797 E. Array Queries【dp,暴力】

时间:2017-05-07 14:47:06      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:com   class   padding   .com   href   ref   sizeof   str   cccccc   

题目链接:codeforces 797 E. Array Queries  

题意:给你一个长度为n的数组a,和q个询问,每次询问为(p,k),相应的把p转换为p+a[p]+k,直到p > n为止,求每次询问要转换的次数。

题解:纯暴力会TLE,所以在k为根号100000范围内dp打表

dp[i][j]表示初始p为i, k为j,需要转换几次可以大于n。

状态转移方程:dp[i][j] = dp[i+a[i]+j] + 1

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 1e5+5;
const int M = 320+5;

int dp[N][M];
int a[N];
int n, q;

int main()
{
    int i, j;
    scanf("%d", &n);
    for(i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }

    memset(dp, 0, sizeof(dp));
    for(i = n; i >= 1; --i) {//dp , 打表
        for(j = 1; j <= M; ++j) {
            if(i + a[i] + j > n) dp[i][j] = 1;
            else {
                dp[i][j] = dp[i+a[i]+j][j] + 1;
            }
        }
    }

    scanf("%d", &q);
    while(q--) {
        int x, y;
        scanf("%d%d", &x, &y);
        if(y <= 320) printf("%d\n", dp[x][y]);
        else {
            int ans = 0;
            for(int p = x; p <= n; p += a[p]+y) 
                ans++;
            printf("%d\n", ans);
        }
    }
    return 0;
}

codeforces 797 E. Array Queries【dp,暴力】

标签:com   class   padding   .com   href   ref   sizeof   str   cccccc   

原文地址:http://www.cnblogs.com/GraceSkyer/p/6820692.html

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