测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A20881. 选数

填空题 困难

题目描述

选数

题目描述

给定两个包含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)。

你需要在满足以上条件的前提下最大化∑ki=1 api,也即最大化数组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.


参考答案

#include <cstdio> #include <algorithm> using namespace std; const int N = 1e5 + 5; int n; int a[N], b[N]; long long f[N], ans; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); for (int i = 1; i <= n; i++) { ans = max(ans, f[i] + a[i]); if (i + b[i] <= n) f[i + b[i]] = max(f[i + b[i]], f[i] + a[i]); f[i + 1] = max(f[i + 1], f[i]); } printf("%lld\n", ans); return 0; }
上一题 下一题