《P15800 [GESP202603 六级] 选数》

题目背景

对应的选择、判断题:试题 - 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=1k​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。

代码实现:

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;
}
相关推荐
Shaoshing11 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_311 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
suhan13 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan13 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan13 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan13 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan13 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB13 小时前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+11114 小时前
算法 --哈希表
数据结构·算法·散列表
灯澜忆梦14 小时前
【面向对象编程c++】| 数组与函数
java·数据结构·c++