1. 程式人生 > >codeforces 797 E. Array Queries【dp,暴力】

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

round codeforce ems 狀態轉移方程 printf ret scan std spa

題目鏈接: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,暴力】