P15800 [GESP202603 六级] 选数

动态规划入门:选数问题解析与背包模型应用 动态规划是解决最优化问题的经典算法思想,通过将问题分解为重叠子问题并存储中间结果来提高效率。其核心原理包括最优子结构、重叠子问题和无后效性三大特征,特别适合处理如背包问题、选数问题等具有阶段性决策的场景。在实际工程中,动态规划广泛应用于资源分配、路径规划、序列比对等领域。以选数问题为例,通过建立状态转移方程(如dp[i][j]表示前i个数和为j的方案数),配合空间优化技巧(滚动数组),可以高效解决这类组合优化问题。掌握动态规划对于参加算法竞赛(如GESP六级考试)和提升编程能力至关重要。 阅读详情

记录133

#include<bits/stdc++.h> 
using namespace std; // 使用标准命名空间std
const int N=1e5+5; // 定义常量N,表示数组长度的最大范围

int n; // 定义全局变量n,表示数组的长度
int a[N],b[N]; // 定义数组a和b,分别存储题目给定的两个数组
long long f[N],ans; // 定义f数组记录到达某位置的最大分数,ans记录全局最大和

int main(){ // 正向递推(刷表法)
    ios::sync_with_stdio(false); // 关闭标准流同步,提升输入输出效率
    cin.tie(0); // 解除cin与cout的绑定,加快读取速度
    
    cin>>n; // 读入数组长度n
    for(int i=1;i<=n;i++){ // 循环读入数组a
        cin>>a[i]; // 读入a[i]
    }
    for(int i=1;i<=n;i++){ // 循环读入数组b
        cin>>b[i]; // 读入b[i]
    }
    
    // 正向递推(刷表法):利用当前下标i的状态,去更新后续位置的状态
    for(int i=1;i<=n;i++){
        // 尝试选择当前下标i:更新全局答案ans
        ans=max(ans,f[i]+a[i]); 
        
        // 如果选择当前下标i,可以跳跃到 i+b[i] 的位置,更新该位置的最大分数
        if(i+b[i]<=n){
            f[i+b[i]]=max(f[i+b[i]],f[i]+a[i]);
        }
        
        // 不选择当前下标i:将当前的最大分数直接传递给下一个位置 i+1
        f[i+1]=max(f[i+1],f[i]);
    }
    
    cout<<ans<<"\n"; // 输出在满足下标条件的前提下,a数组对应下标的整数之和的最大值
    return 0; // 程序正常结束
}

题目传送门https://www.luogu.com.cn/problem/P15800


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题是一道非常经典的线性动态规划(DP)问题,其核心难点在于理解下标之间的跳跃约束。

  1. 状态定义:
    我们定义 f[i] 表示:当我们处理到第 i 个位置时,能够获得的最大分数(注意:f[i] 代表的是从前面某个位置转移过来,准备在 i 或之后的位置进行决策时的累积得分,它本身不包含 a[i])。

  2. 约束条件的转化:
    题目要求如果选择了下标 p_i,那么下一个下标 p_{i+1} 必须满足 p_{i+1} >= p_i + b[p_i]。这意味着,如果我们当前站在位置 i 并决定选择它,那么我们下一次能够进行决策的最早位置就是 i + b[i]。

  3. 状态转移(刷表法):
    对于每一个位置 i,我们有两种选择:

    • 选择位置 i:我们将 a[i] 加入总分,并将这个新的总分传递给下一个合法的位置 i + b[i]。即 f[i + b[i]] = max(f[i + b[i]], f[i] + a[i])。同时,因为选择了 i,我们可以用 f[i] + a[i] 去更新全局的最大答案 ans。
    • 不选择位置 i:如果我们放弃位置 i,那么当前累积的分数 f[i] 可以原封不动地传递给下一个相邻位置 i + 1。即 f[i + 1] = max(f[i + 1], f[i])。
  4. 最终答案:
    在遍历过程中,我们随时记录 f[i] + a[i] 的最大值,最终输出这个全局最大值即可。


 代码分块详细解释

1. 头文件、常量与全局变量定义

#include<bits/stdc++.h> 
using namespace std; 
const int N=1e5+5; // 定义常量 N,表示数组长度的最大范围

int n; // 定义全局变量 n,表示数组的长度
int a[N], b[N]; // 定义数组 a 和 b,分别存储题目给定的两个数组
long long f[N], ans; // 定义 f 数组记录到达某位置的最大分数,ans 记录全局最大和
  • 详细分析:这部分搭建了算法的基础。由于数组长度 n 最大为 10^5,且 a_i 最大可达 10^9,累加后的总分数可能会超过 int 的范围,因此 f 数组和答案 ans 必须使用 long long 类型来防止数据溢出。

2. 输入处理

int main(){ 
    ios::sync_with_stdio(false); // 关闭标准流同步,提升输入输出效率
    cin.tie(0); // 解除 cin 与 cout 的绑定,加快读取速度
    
    cin>>n; // 读入数组长度 n
    for(int i=1;i<=n;i++){ // 循环读入数组 a
        cin>>a[i]; // 读入 a[i]
    }
    for(int i=1;i<=n;i++){ // 循环读入数组 b
        cin>>b[i]; // 读入 b[i]
    }
  • 详细分析:在读取数据之前,使用了标准的 IO 加速语句。在 n 达到 10^5 级别时,这能有效避免因为输入输出过慢而导致的超时。随后依次读入两个数组的数据,为接下来的动态规划做准备。

3. 核心逻辑:正向递推(刷表法)

    // 正向递推(刷表法):利用当前下标 i 的状态,去更新后续位置的状态
    for(int i=1;i<=n;i++){
        // 尝试选择当前下标 i:更新全局答案 ans
        ans = max(ans, f[i] + a[i]); 
        
        // 如果选择当前下标 i,可以跳跃到 i + b[i] 的位置,更新该位置的最大分数
        if(i + b[i] <= n){
            f[i + b[i]] = max(f[i + b[i]], f[i] + a[i]);
        }
        
        // 不选择当前下标 i:将当前的最大分数直接传递给下一个位置 i+1
        f[i + 1] = max(f[i + 1], f[i]);
    }
  • 详细分析:这是整个算法的灵魂,采用了“刷表法”(即由当前状态去更新未来状态)。
    • 更新全局最优解:f[i] 表示到达位置 i 之前(不包含 i)的最大累积分数。如果我们在位置 i 停下并选择它,那么当前的总分就是 f[i] + a[i]。我们随时用这个值去挑战全局最大值 ans。
    • 跳跃转移(选择 i):如果决定选择 a[i],根据题目约束 p_{i+1} >= p_i + b[p_i],下一个能够做决策的位置至少是 i + b[i]。我们将当前获得的总分 f[i] + a[i] 传递给 f[i + b[i]],并取最大值。
    • 相邻转移(不选 i):如果我们决定放弃 a[i],那么位置 i 就没有产生任何价值,也没有触发跳跃限制。因此,到达位置 i 的累积分数 f[i] 可以直接顺延到下一个位置 i + 1。这保证了我们可以连续跳过某些位置。

4. 输出结果

    cout << ans << "\n"; // 输出在满足下标条件的前提下,a 数组对应下标的整数之和的最大值
    return 0; // 程序正常结束
}
  • 详细分析:在遍历完所有位置后,ans 中存储的就是所有合法下标组合中,a 数组对应下标整数之和的最大值,直接输出即可。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
数据类型long long f[N], ans使用 64 位长整型防止 a_i (最大 109) 累加时超出 int 范围导致数据溢出
IO 优化ios::sync_with_stdio(false)提升输入输出效率解决 10^5 级别数据量下 cin/cout 可能导致的超时问题
状态定义f[i]记录到达位置 i 时的最大累积分数将复杂的下标跳跃约束,转化为线性的状态传递问题
跳跃转移f[i+b[i]] = max(...)处理“选择当前下标”的情况完美契合题目中 p_{i+1} >= p_i + b[p_i] 的约束条件
顺延转移f[i+1] = max(f[i+1], f[i])处理“不选当前下标”的情况允许程序跳过某些下标,保证决策的灵活性
全局打擂ans = max(ans, f[i]+a[i])实时更新最终答案确保能够捕获到遍历过程中出现的任何合法的最大分数
题解:洛谷 P15800 [GESP202603 六级] 选数 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。一行,一个整数,表示在满足下标条件的前提下,数组。你需要在满足以上条件的前提下最大化。对应下标的整数之和的最大值。#普及# #线性DP-一维#本文分享的必刷题目是从。洛谷:[P15800。对应下标的整数之和。 阅读详情

相关推荐

CTFshow MISC入门实战:010Editor+TweakPNG解决PNG隐写难题(附完整脚本)

本文详细介绍了在CTFshow MISC比赛中,如何利用010Editor和TweakPNG两款专业工具构建高效的PNG隐写分析工作流。文章从PNG文件结构解析入手,通过实战案例演示了如何协同使用010Editor进行二进制侦察与结构分析,以及使用TweakPNG进行数据块的精准编辑与删除,并最终提供了自动化分析脚本,帮助选手系统性地解决PNG隐写难题。

weixin_29252171的博客 78

从爆搜到满分题解-P15800 [GESP202603 六级] 选数

题目描述了两个数组a和b,要求选择一组下标满足特定条件,使得对应的a数组元素之和最大。解题思路从暴搜逐步优化到动态规划,最终给出了一维线性DP解法。各版本代码展示了从递归到记忆化再到DP的优化过程,其中版本4的二维DP因内存问题仅用于教学理解。最终解法适用于大规模数据,时间复杂度为线性。输入输出样例展示了不同情况下的计算结果。

2402_85268226的博客 425

STM32H7系列QSPI内存映射模式与MPU配置冲突分析

本文分析了STM32H7系列QSPI内存映射模式与MPU配置冲突导致系统卡死的问题。通过解析内存保护管理单元机制,提供了MPU配置调整方案,包括禁用MPU或精细配置QSPI区域权限,确保内存映射模式正常访问外部Flash,避免HardFault错误。

js777的博客 741

【GESP】C++六级真题 luogu-P15800, [GESP202603 六级] 选数

2026年3月,GESP六级真题,考察线性动态规划,难度⭐⭐★☆☆。普及/提高−。

CoderCoding的博客 178

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3568

告别卡顿!用U盘给你的MacBook Pro 2015+来一次macOS Monterey的‘大扫除’式安装

每次系统升级后,老款MacBook Pro用户最常抱怨的就是"怎么比之前更卡了?"——这不是错觉。系统迭代过程中积累的缓存文件、残留配置和隐形服务,就像房间角落堆积的灰尘,拖慢了整台机器的响应速度。而通过U盘进行的macOS Monterey全新安装,本质上是一次彻底的"数字大扫除":它不仅替换系统文件,还会重建所有索引、清理磁盘碎片,甚至能解决某些玄学般的卡顿问题。对于2015款及之后的MacBook Pro用户,这种安装方式能让老设备重获新生。

weixin_28731223的博客 312

《P15800 [GESP202603 六级] 选数》

这篇文章摘要可以概括为: 题目要求在给定两个整数数组a和b的情况下,选择一组满足特定条件(相邻下标间隔限制)的下标序列,使得对应a数组元素之和最大。关键约束是下一个选择的下标必须不小于当前下标加上b数组中对应位置的值。输入包含数组长度n,数组a和b的具体数值;输出为满足条件的最大和。示例展示了不同输入下的正确输出结果。题目对数据规模和算法效率有一定要求(n≤10^5),提示需要使用动态规划等高效解法。

Jasmine_llq的博客 172

Modbus协议全家桶(C#纯原生完整版):ModbusRTU + ModbusTCP + ModbusASCII 协议规范+完整封装+工业级实战

你已经掌握了C#串口/网口原生核心API和工业通信协议本质,而今天的主角Modbus协议,是工业通信领域绝对的王者、通用的标准、入门的必修课,没有之一。凡是做工业通信开发,必会Modbus协议;市面上99%的工业设备(PLC、变频器、温控仪、传感器、流量计、扫码枪)都原生支持Modbus协议。Modbus协议不是单一协议,而是一个「协议家族」,我们常说的就是这个家族的三大核心成员,也是工业现场的全部Modbus应用形态。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 565

洛谷 P15800:[GESP202603 六级] 选数 ← 动态规划

这是一个典型的带跳跃限制的动态规划问题。如果我们当前选择位置 i,那么下一个可选择的位置必须满足 j≥i+b[i]。因此,可以从 i 跳到区间 [i+b[i], n]。 

hnjzsyjyj的专栏 606

cdk&java | 绘制含有丰富信息的化学反应(适合论文、网页、PPT)

package org.example; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.depict.DepictionGenerator; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.interfaces.IReaction; import org.openscience.cdk.

ASKCOS博客 899

Python APP反爬实战:Frida+Charles抓包,破解签名校验

Charles抓包定位参数 → jadx-gui反编译找函数 → Frida Hook拿密钥/规则 → Python还原签名算法;Frida的核心价值:Hook住APP的加密函数,拿到“输入(密钥/参数)+输出(签名)”,无需懂复杂的逆向底层;严格对齐APP的参数排序、拼接规则、加密算法,差一点都会验证失败。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1538

CCF-GESP计算机学会等级考试2026年3月六级C++T1 选数

这道题目要求从两个数组中选择下标,满足特定条件的情况下最大化元素和。通过动态规划+前缀最大值优化,实现了O(n)时间复杂度的解法。核心思路是维护一个f数组记录每个位置可继承的最大和,并依次处理每个元素,更新后继位置的最优解。该方法高效处理了大规模数据,避免了二分查找,空间复杂度为O(n)。样例验证表明算法正确,边界条件和类型选择也得到了妥善处理。

长春高老师编程 744

135、转动惯量辨识方法

<think>我们要求根据内容生成≤150字的文章摘要。内容是关于电机控制中转动惯量辨识的方法和工程经验。摘要需简洁概括核心:转动惯量重要性、三种方法(加减速法、正弦扫频、MRAS)、工程注意点(摩擦补偿、采样同步等)、实用建议(组合使用、滤波限幅、安全保护)。字数严格≤150。需要提炼。</think>转动惯量辨识是电机控制的关键,负载变化会导致速度环失稳。工程常用加减速法(简单可靠)、正弦扫频法(高精度)、MRAS在线辨识。实操需补偿摩擦、同步采样、控制激励幅度。建议混合使用,辨识结果需滤波限幅,并设置

2401_88858637的博客 40

GESP认证C++编程真题解析 | 202603 六级

取第 i 个房子,结果为 dp[i-2] + nums[i],这意味着跳过第 i-1 个房子,直接在前 i-2 个房子的最优解基础上加上第 i 个房子的糖果数。某二叉树共有10个结点,记为A~J,已知它的先序遍历序列为:A B D H I E C F J G,中序遍历序列为:H D I B E A F J C G,则该二叉树的后序遍历序列是( )。在二叉搜索树(BST)中,若中序遍历的序列为{1, 2, 3, 4, 5},且先序遍历的第一个序列元素为3,则下列说法正确的是( )。子节点入栈是先右后左。

团爸讲算法 697

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

P15802 [GESP202603 七级] 拆分

本文汇总了GESP202603各级别编程真题资源,包括七级题目《拆分》和《物流网络》的多平台解析视频(B站、知乎),以及一级至六级各类编程题(如《交朋友》《数数》《凯撒密码》《有限不循环小数》等)的题目链接和部分优快云博客解析。内容涵盖C++真题讲解、算法实现与解题思路,适合备考GESP等级考试的学习者参考。(149字)

青少年趣味编程 617

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

P15805 [GESP202603 八级] 子图最短路

本文汇总了2026年3月GESP考级C++各等级真题资源,包含八级真题视频讲解(消息查找、子图最短路等题目)、各级别试题及解析(一至八级)。资源涵盖B站视频教程、优快云博客题解以及洛谷题目链接,涉及一级交朋友、二级数数、三级凯撒密码、四级礼盒排序、五级有限不循环小数、六级完全二叉树、七级物流网络等典型考题,为考生提供全面的备考资料。所有内容均标注原始出处链接,方便学习者查阅详细解析。

青少年趣味编程 595

P15804 [GESP202603 八级] 消息查找

本文整理了2026年3月GESP考级C++各等级真题资源,包括八级的"消息查找"和"子图最短路"(含B站视频讲解、优快云题解和洛谷题目链接),以及一级至七级的各类编程题目(如"交朋友"、"数字替换"、"数数"等)。所有题目均附有洛谷题库链接和详细的优快云解析,为考生提供全面的备考资料。特别是八级题目还配有多个视频讲解,涵盖算法实现思路和解题技巧。

青少年趣味编程 824

P15803 [GESP202603 七级] 物流网络

本文汇总了GESP等级考试2026年3月各等级C++真题资源,包括七级"物流网络"的多版本视频解析(B站6个)、知乎专栏文章以及洛谷题目解析。同时收录了一至七级共13道真题资源,涵盖一级"交朋友/数字替换"、二级"数数/画画"、三级"二进制回文串/凯撒密码"、四级"山之谷/礼盒排序"、五级"有限不循环小数/找数"、六级"选数/完全二叉树"以及七级"拆分&quo

青少年趣味编程 668

GESP202603 C++ 一级--八级

本文整理了GESP(软件编程等级考试)各级别的题目资源,包括一级到八级的编程题(如交朋友、数字替换、二进制回文串等)及相关学习资料。提供优快云博客链接,包含GESP一级到四级样题解析、视频教程、备考书籍推荐(2025.09更新)以及具体题目讲解(如温度转换、图书馆老鼠等)。适合考生系统备考,内容涵盖基础编程到算法应用。

青少年趣味编程 555

动态规划选数问题解析:从洛谷P15800到背包问题优化

动态规划作为算法设计的核心思想,通过将复杂问题分解为重叠子问题来提升计算效率。其核心原理在于状态定义与转移方程设计,特别适用于解决最优化和计数类问题。在背包问题等经典场景中,动态规划能将指数级复杂度优化至多项式级别,例如01背包问题通过二维状态表示可达到O(n*W)时间复杂度。本文以洛谷P15800选数问题为例,详解如何通过状态压缩技巧将空间复杂度从O(n*target)优化到O(target),并分析内层循环倒序遍历避免重复计算的关键实现细节。这类技术在算法竞赛和工程实践中广泛应用,如资源分配、路径规划等

weixin_34161083的博客 372

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 302

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 308

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 329

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 601

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 144
上一篇: P14920 [GESP202512 六级] 道具商店
下一篇: P14919 [GESP202512 六级] 路径覆盖
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值