codeforces 797 E. Array Queriesdp,暴力

Posted GraceSkyer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 797 E. Array Queriesdp,暴力相关的知识,希望对你有一定的参考价值。

题目链接: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 Queriesdp,暴力的主要内容,如果未能解决你的问题,请参考以下文章

Array Queries CodeForces - 797E

CodeForcs 797E Array Queries

CodeForces E. Lucky Array 幸运数列

CodeForces 797E 部分dp

Codeforces 408 E. Curious Array

Codeforces 785 E. Anton and Permutation(分块,树状数组)