简单dp,dp[i]表示当前在i位置的最大值。注意答案不是dp[n],因为最大的情况不一定可以走到n这个位置。时间复杂度O(n^2)
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> w(n);
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> w[i];
}
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<int> dp(n, 0);
int maxgrass = 0;
for (int i = 0; i < n; ++i) {
dp[i] = w[i];
for (int j = 0; j < i; ++j) {
if ((i - j) % a[j] == 0) {
dp[i] = max(dp[i], dp[j] + w[i]);
}
}
if (maxgrass < dp[i]) maxgrass = dp[i];
}
cout << maxgrass;
}