题目描述如下:
如果暴力硬算的话,会发现后半截数据会重复计算,浪费时间
所以从后往前计算,dp就自然而然出来了
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n);
for (int& x : a) {
cin >> x;
}
vector<int> dp(n);
//int maxnum=0;
for (int i = n - 1; i >= 0; i--) {
dp[i] = a[i];
int j = i + a[i];
if (j < n) {
dp[i] += dp[j];
}
// maxnum=max(maxnum,dp[i]);
}
cout << *max_element(dp.begin(), dp.end()) << endl;
//cout<<maxnum<<endl;
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}