题意:一个长度为n的数组,ai ,1=<I<=n.给定q个询问,每个询问包含p和k。有下面的操作,没进行一次q将等于q+k+a[q],问进行几次时q将大于n。
思路:部分dp,k较大时,路径较短,可以暴力,k较小时,路径可能很深,记忆化搜索.
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100010;
int a[maxn];
int f[maxn][420];
int n;
int dfs(int q,int k)
{
if(q>n)return 0;
if(k>400) return 1+dfs(q+a[q]+k,k);
else return f[q][k]=(f[q][k]?f[q][k]:dfs(q+a[q]+k,k)+1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int Q;
scanf("%d",&Q);
while(Q--)
{
int q,k;
scanf("%d%d",&q,&k);
printf("%d\n",dfs(q,k));
}
}