codeforces 797 E. Array Queries【dp,暴力】
阿新 • • 發佈:2017-05-07
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> usingnamespace 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,暴力】