题目背景
对应的选择、判断题:试题 - GESP 202603 C++ 六级 - 洛谷有题
题目描述
给定两个包含 n 个整数的数组 a=a1,...,an 与 b=b1,...,bn。你需要指定若干下标 p1<⋯<pk(1≤k≤n)使得以下条件成立:
- 1≤pi≤n(1≤i≤k);
- pi+1≥pi+bpi(1≤i<k)。
你需要在满足以上条件的前提下最大化 ∑i=1kapi,也即最大化数组 a 对应下标的整数之和。
输入格式
第一行,一个正整数 n,表示数组长度。
第二行,n 个正整数 a1,a2,...,an,表示数组 a。
第三行,n 个正整数 b1,b2,...,bn,表示数组 b。
输出格式
一行,一个整数,表示在满足下标条件的前提下,数组 a 对应下标的整数之和的最大值。
输入输出样例
输入 #1复制
4
1 2 3 4
3 3 1 1
输出 #1复制
7
输入 #2复制
6
1 1 4 5 1 4
1 2 3 2 1 0
输出 #2复制
11
说明/提示
对于 40% 的测试点,保证 2≤n≤103。
对于所有测试点,保证 2≤n≤105,0≤ai≤109,0≤bi≤n。
代码实现:
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> a(n+2);
vector<int> b(n+2);
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cin >> b[i];
vector<ll> dp(n+2, 0);
for(int i = n; i >= 1; i--)
{
dp[i] = dp[i+1];
int nxt = i + b[i];
if(nxt > n)
{
dp[i] = max(dp[i], a[i]);
}
else
{
dp[i] = max(dp[i], a[i] + dp[nxt]);
}
}
cout << dp[1] << endl;
return 0;
}