https://codeforces.com/problemset/problem/1472/C
思路:我的想法是从后往前递推,因为某一格所得的总分是由其后面能跳的格数的分数加起来的
所以我们从后往前递推,令 t = num[i] + i,也就是当前格子要跳的下一个格子,如果下一个格子小于等于 n ,那么这一个格子的总分就等于下一个格子的总分加上当前格子的总分,也就是 dp[i] += dp[t] + num[i],否则的话,就是当前格子的分数,最后我们再排序,输出最大的就可以了
以下是代码实现:
这里我对dp数组做了一下预处理
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll num[N],dp[N];
void solved()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
dp[i]=num[i];
}
for(int i=n;i>=1;i--)
{
ll t=num[i]+i;
if(t<=n)
{
dp[i]+=dp[t];
}
else dp[i]=dp[i];
}
sort(dp+1,dp+1+n);
cout<<dp[n]<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin>>t;
while(t--)
{
solved();
}
return 0;
}