【问题描述】
对于一个具有 n 个元素的数组 a , 执行以下操作:
-
-
首先,选择下标 i (1 ≤ i ≤n)—— 设置为数组的开始位置,放一个标记在 i 处(在值 ai 的地方)
-
当 i ≤ n 时,你的得分将增加 ai ,且将标记向右移动 ai 个位置,也就是说用 i +ai 替换 i ,继续这个过程
-
如果 i >n,则结束操作
-
例如, 如果 n = 5且a=[7, 3, 1, 2, 3],则可以进行以下操作
-
-
选择 i = 1,操作过程为
,最后得分为 a1 = 7
-
选择 i = 2,操作过程为
, 最后得分为 a2 + a5 = 6
-
选择 i = 3,操作过程为
, 最后得分为 a3 + a4 = 3
-
选择 i = 4,操作过程为
, 最后得分为 a4 = 2
-
选择 i = 5,操作过程为
, 最后得分为 a5 = 3
-
请选择合适的开始位置,使得经过上述操作后可获得最大的分数。
【输入形式】
输入的第一行为一个整数 t (1≤ t ≤ 104),表示测试用例的组数。
每个测试用例的第一行为一个整数 n (1≤ n ≤ 2×105),表示数组 a 的元素个数
接下来一行包含 n 个整数 a1、a2、...、an (1 ≤ ai ≤ 109),表示数组 a 的元素
【输出形式】
对于每个测试用例,输出独立一行,表示选择合适的开始位置后经过上述操作可以获得的最大分数。
【样例输入】
4 5 7 3 1 2 3 3 2 1 4 6 2 1000 2 3 995 1 5 1 1 1 1 1
【样例输出】
7 6 1000 5
【样例说明】
来源:1472C
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t, n; cin >> t;
long f, max, c;
while (t--) {
cin >> n;
int a[n];
for (int i=0; i<n; i++) cin >> a[i];
max=0;
for (int i=0; i<n; i++) {
f=i+1; c=0;
while (f<=n) {
c+=a[f-1]; f+=a[f-1];
}
if (c>max) max=c;
}
cout << max << endl;
}
return 0;
}