首页 > 代码库 > CodeForces 797E 部分dp
CodeForces 797E 部分dp
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 secondtypedef 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。