P10721 [GESP202406 六级] 计算得分

从GESP六级题解析信奥刷题心法:C++实现与高效环境搭建 在信息学奥林匹克竞赛(信奥)和编程能力认证(如GESP、CSP)的备考中,刷题是提升算法思维和编程能力的关键实践。其核心原理在于通过大量问题求解,将基础数据结构、算法设计与具体编程语言(如C++)实现相结合,训练逻辑抽象与严谨实现的能力。这一过程的技术价值在于,它不仅能帮助考生掌握经典算法模型,更能培养将复杂问题转化为可计算步骤的工程化思维,从而在竞赛和实际开发中高效解决问题。典型的应用场景包括备战GESP六级、CSP-J/S等认证考试,以及系统学习算法与数据结构。本文以一道考察状态机思想和数列求和公式的G 阅读详情

记录120

#include<bits/stdc++.h>
using namespace std;
const int MAXN=30;// 计分序列最大长度 n <= 20
const int MAXM=1e5+10;// 字符串最大长度 m <= 10^5
int a[MAXN],dp[MAXM];// 计分序列 a[i], dp[i] 表示前 i 个字符的最大得分
int main(){// 线性DP 
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	string s;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	cin>>s;
	for(int i=1;i<=m;i++){
		// 情况1:第 i 个字符不作为任何计分子串的结尾
		dp[i]=dp[i-1];// 保底策略(不选当前位置)
		// 情况2:尝试以第 i 个字符为结尾,向前匹配 k 个连续的 "abc"
		 // k 代表当前匹配了 k 个 "abc",每个 "abc" 长度为 3
		for(int k=1;k<=n;k++){
            // 计算当前 k 个 "abc" 的起始位置(在字符串 s 中的下标)
            // i 是第几个字符,对应 s 的下标是 i-1
            // k 个 "abc" 总长度为 3*k,所以起始下标为 (i - 1) - (3 * k - 1) = i - 3 * k
			int start_id=i-3*k;
			// 如果起始位置超出了字符串开头,说明无法凑出 k 个 "abc",跳出循环
			if(start_id<0) break;
			// 检查从 start_id 开始的 3 个字符是否为 "abc"
            // 如果匹配成功,更新最大得分
            // 得分 = 起始位置之前的最大得分 + 当前 k 个 "abc" 的分数 a[k]
			if(s.substr(start_id,3)=="abc") dp[i]=max(dp[i],dp[start_id]+a[k]);// 进攻策略(尝试用当前位置得分)
            // 如果当前这 3 个字符不是 "abc",说明无法凑出更长的连续 "abc" 串了
            // 例如想凑 2 个 abc,但倒数第二个 abc 位置不对,那 3 个、4 个肯定也不对
			else break;
		}
	}
	cout<<dp[m]<<"\n";
	return 0;//结束程序 
}

前言

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

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

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


💡 核心思路分析

1. 题意理解与数学建模

  • 目标:在一个字符串中,找出若干个不重叠的、由 kk 个连续的 "abc" 组成的子串,使得这些子串的得分总和最大。
  • 计分规则:一个由 kk 个 "abc" 组成的子串得分为 akak​ 。注意, kk 个 "abc" 必须严格连续,且字符不能重复使用(即选取的子串之间不能有交集)。

2. 算法选择:线性动态规划 (DP)

  • 题目要求我们在字符串上“切”出若干段合法的子串,这是非常经典的线性 DP / 序列划分模型。
  • 状态定义:设 dp[i] 表示处理完字符串的前 i 个字符时,能够获得的最大总得分。
  • 状态转移:对于第 i 个字符,我们有两种决策:
    • 决策一(不选):第 i 个字符不作为任何计分子串的结尾。那么前 i 个字符的最大得分就等于前 i-1 个字符的最大得分,即 dp[i] = dp[i-1]。
    • 决策二(选):第 i 个字符恰好是某个合法子串的结尾。假设这个子串是由 kk 个 "abc" 组成的(长度为 3k3k ),那么这个子串的起始位置就是 i - 3*k + 1(对应代码中的下标 start_id = i - 3*k)。如果这一段确实是连续的 "abc",那么 dp[i] 就可以从 dp[start_id] + a[k] 转移而来。我们只需要枚举所有可能的 kk ,取最大值即可。

3. 关键优化:利用连续性剪枝

  • 在枚举 kk 时,由于我们要找的是连续的 "abc",所以当我们检查倒数第 kk 个 "abc" 发现它不是 "abc" 时,就没必要继续检查 k+1,k+2...k+1,k+2... 了,直接 break 跳出循环。这极大地减少了无效的字符串匹配操作。

📝 代码逐行深度解析

第一部分:头文件、常量与全局变量定义
#include<bits/stdc++.h>
using namespace std;
const int MAXN=30;       // 计分序列最大长度 n <= 20,开 30 足够
const int MAXM=1e5+10;   // 字符串最大长度 m <= 10^5,防止越界稍微开大一点
int a[MAXN], dp[MAXM];   // a[i] 存储得分为 a_i;dp[i] 表示前 i 个字符的最大得分

解析:这里定义了基础的常量和数组。dp 数组是一维的,因为线性 DP 只需要依赖前面的状态,空间复杂度为 O(m)O(m) 。

第二部分:主函数入口与数据读入
int main(){ 
	ios::sync_with_stdio(false); // 关闭 C++ 标准输入输出流与 C 标准库的同步
	cin.tie(0);                  // 解除 cin 和 cout 的绑定
	int n, m;
	string s;
	cin >> n;                    // 读入计分序列的长度
	for(int i = 1; i <= n; i++) cin >> a[i]; // 读入每个 k 对应的得分 a_k
	cin >> m;                    // 读入字符串的长度
	cin >> s;                    // 读入字符串

解析:使用了标准的 IO 加速技巧,这在处理高达 105105 级别的数据时非常重要,能有效避免因读写耗时导致的超时(TLE)。

第三部分:DP 状态初始化与保底策略
	for(int i = 1; i <= m; i++){
		// 情况1:第 i 个字符不作为任何计分子串的结尾
		dp[i] = dp[i-1]; // 保底策略(不选当前位置)

解析:外层循环遍历字符串的每一个位置 i。首先执行“决策一”,无论当前位置能否构成 "abc",我们至少可以继承前一个位置的最优解。这保证了 dp[i] 具有单调不减的性质。

第四部分:枚举连续 "abc" 的个数并尝试状态转移
		// 情况2:尝试以第 i 个字符为结尾,向前匹配 k 个连续的 "abc"
		// k 代表当前匹配了 k 个 "abc",每个 "abc" 长度为 3
		for(int k = 1; k <= n; k++){
            // 计算当前 k 个 "abc" 的起始位置(在字符串 s 中的下标)
            // i 是第几个字符(从1开始),对应 s 的下标是 i-1
            // k 个 "abc" 总长度为 3*k,所以起始下标为 (i - 1) - (3 * k - 1) = i - 3 * k
			int start_id = i - 3 * k;
			
			// 边界判断:如果起始位置超出了字符串开头,说明无法凑出 k 个 "abc",跳出循环
			if(start_id < 0) break;

解析:进入内层循环,枚举以当前位置结尾可能包含的 "abc" 的数量 kk 。通过简单的数学推导得出待检查子串的起始下标 start_id,并进行防越界的边界判断。

第五部分:合法性校验、状态更新与剪枝
			// 检查从 start_id 开始的 3 个字符是否为 "abc"
            // 如果匹配成功,更新最大得分
            // 得分 = 起始位置之前的最大得分 + 当前 k 个 "abc" 的分数 a[k]
			if(s.substr(start_id, 3) == "abc") 
                dp[i] = max(dp[i], dp[start_id] + a[k]); // 进攻策略(尝试用当前位置得分)
            
            // 如果当前这 3 个字符不是 "abc",说明无法凑出更长的连续 "abc" 串了
            // 例如想凑 2 个 abc,但倒数第二个 abc 位置不对,那 3 个、4 个肯定也不对
			else break;
		}
	}
	cout << dp[m] << "\n"; // 输出整个字符串的最大得分
	return 0;              // 结束程序 
}

解析:这是代码的核心灵魂所在。利用 C++ 的 substr 函数快速截取并比对字符串。如果匹配成功,则进行状态转移(dp[start_id] + a[k]);如果匹配失败,立刻 break 终止内层循环。这种基于连续性的剪枝,让算法在最坏情况下也能保持极高的运行效率。最终,dp[m] 即为所求的全局最优解。

gesp(C++六级)(9)洛谷:P10721:[GESP202406 六级] 计算得分 阅读详情

相关推荐

题解:洛谷 P10721 [GESP202406 六级] 计算得分

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。,并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。问题,核心在于将字符串匹配与 DP 结合,在位置。小杨想知道对于给定的字符串,最大总得分是多少。字符不能重复计算得分,求最大总得分。输出一个整数,代表给定字符串的最大总得分。个小写字母组成的字符串的得分。,如果字符串的一个子串由。

团爸讲算法 364

P10722 [GESP202406 六级] 二叉树 思路

P10722 [GESP202406 六级] 二叉树

2201_75476959的博客 1450

GESP六级真题考点分析和解题思路

本文分析了GESP六级考试的18道真题,涵盖动态规划、树形结构、图论算法等核心考点。重点题目包括下楼梯(动态规划)、工作沟通(LCA算法)、运送物资(网络流)等。试题难度以普及级为主,涉及拓扑排序、树形DP、二分答案等典型算法。备考建议掌握动态规划状态转移、树结构的DFS遍历、图论算法实现等关键技能,并熟悉提供的代码模板(如拓扑排序和树直径计算)。通过系统练习这些高频题型和算法模板,可以有效提升六级考试通过率。

lan_in的博客 776

# P10721 [GESP202406 六级] 计算得分

摘要:本文提出了一个基于动态规划的字符串最大得分计算问题。给定长度为n的计分序列A和由m个小写字母组成的字符串,当子串由k个"abc"重复组成时可获得分数a_k,且子串不可重叠。采用动态规划方法,定义dp[i]表示前i个字符的最大得分,通过遍历字符串并检查所有可能的"abc"重复子串来更新状态。最终dp[m]即为字符串的最大得分,算法时间复杂度为O(mn)。示例验证了该方法的正确性。

一只高猫的博客 1094

从MIPS汇编到C语言:手把手教你用Mars模拟器理解指令集(附实战代码)

本文详细介绍了如何使用Mars模拟器从MIPS汇编过渡到C语言编程,通过实战代码解析ADD、LW、BEQ等指令集与C语言结构的对应关系。内容涵盖环境搭建、算术运算、内存访问、条件分支及函数调用等核心概念,帮助读者深入理解MIPS指令分类和计算机底层运行机制。

weixin_26821003的博客 361

全网最详细单细胞保姆级分析教程(一) ---pbmc

通过观察热图,可以了解不同细胞在主成分上的分布情况,以及主成分与细胞特征之间的关系。数据归一化是数据分析中的常见步骤,旨在消除数据集中不同特征之间的量纲差异,并使它们在相同的尺度上进行比较。函数会根据指定的主成分维度计算数据点之间的距离,并找到每个数据点的邻居。函数会根据数据点之间的相似性将其分组到不同的聚类中。数据缩放是数据分析中的常见步骤,旨在将数据的特征值调整到相似的范围,以避免某些特征对分析结果的过度影响。通过可视化维度载荷,可以了解哪些特征对主成分的形成起到了重要作用,以及不同特征之间的相关性。

ZxVSaccount的博客 6712

GESP2024年6月认证C++六级( 第三部分编程题(1)计算得分)

GESP2024年6月认证C++六级( 第三部分编程题(1)计算得分)

汉克老师的博客 678

【GESP】C++四级考试大纲知识点梳理, (10) 文件读写和重定向

其实,由于本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。孩子放假,出游一周,没有更新。刚刚归来,继续学习。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。(10)掌握文件操作中的重定向,实现文件读写操作,了解文本文件的分类,掌握写操作、读操作、读写操作。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。孩子放假,出游一周,没有更新。

CoderCoding的博客 527

洛谷 P10721 [GESP202406 六级] 计算得分-普及/提高-

并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。先统计连续的 abc 个数,并用动态规划算出最优得分。小杨想知道对于给定的字符串,最大总得分是多少。输出一个整数,代表给定字符串的最大总得分。首尾相接组成,那么能够得到分数。个小写字母组成的字符串的得分。,如果字符串的一个子串由。个正整数,代表计分序列。个小写字母组成的字符串。例如,假设 ,字符串。第一行包含一个正整数。第三行包含一个正整数。对于全部数据,保证有。,代表字符串的长度。

weixin_37253733的博客 1112

瑞芯微RK3588系统重装实战:从Windows到Linux的完整烧录指南

本文提供了一份详尽的瑞芯微RK3588开发板系统重装实战指南,涵盖从Windows到Linux双平台的完整烧录流程。针对RK3588芯片特性,详细解析了驱动安装、工具使用、固件烧录步骤及常见问题排错,旨在帮助开发者高效、安全地完成系统切换与部署,快速投入AI推理与边缘计算等应用开发。

weixin_29164185的博客 362

风力摆控制系统 PCB 设计 3 要点:STM32+MPU6050+空心杯电机驱动一体化

本文详细解析了风力摆控制系统PCB设计的3大核心要点,重点介绍STM32主控、MPU6050姿态传感器与空心杯电机驱动的一体化方案。通过系统架构设计、PCB布局布线技巧以及噪声抑制方案,帮助参赛者在电子设计竞赛中构建高精度、高稳定性的风力摆控制系统,提升竞赛作品性能。

weixin_30363285的博客 363

《P10721 [GESP202406 六级] 计算得分》

摘要: 题目要求计算由m个小写字母组成的字符串的最大得分,得分规则基于计分序列A。字符串的子串若由k个"abc"首尾相接组成(1≤k≤n),则得分ak,且字符不可重复计分。需通过动态规划等方法高效求解。例如,输入样例中最优计分方式为分解为3个单"abc"子串,总分9。数据范围:n≤20,m≤1e5,ai≤1000,需处理大规模字符串与不同子串组合。 核心要点: 计分规则:子串需为连续的k个"abc"(如"abcabc"对应k=2

Jasmine_llq的博客 161

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 560

打卡信奥刷题(1994)用C++实现信奥 P10721 [GESP202406 六级] 计算得分

该题目要求计算字符串中由"abc"重复组成的子串的最大得分。使用动态规划预处理计分序列的最优解(完全背包问题),然后遍历字符串统计连续"abc"序列的长度,将每个连续序列转换为对应的最大得分并累加。算法时间复杂度为O(n + m),适用于大规模数据。样例输入输出展示了如何通过合理分割字符串获得最高得分。代码实现简洁高效,结合了字符串处理和动态规划两种技术。

Loge谈信奥--一个专注于信奥人的博客 834

基于Qt C++开发一个体测数据管理系统

advice.dietAdvice = "饮食建议:\n1. 控制总热量摄入,每天减少300-500大卡\n2. 减少精制碳水(白米饭、白面包、甜食)\n3. 增加优质蛋白和膳食纤维摄入\n4. 烹饪方式以蒸、煮、烤、凉拌为主,减少油炸\n5. 晚餐适量减少,睡前3小时避免进食";dataTable->setHorizontalHeaderLabels({"ID", "用户名", "身高(cm)", "体重(kg)", "BMI", "体脂率(%)", "记录时间"});

寒寒豆豆软件公司的博客 192

2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程

同学们,大家好!今天我们要学习的是riboWaltz——一款专为Ribo-seq(核糖体足迹测序)数据设计的R包,主要用于P-site定位优化和三碱基周期性分析。P-site的准确定位是Ribo-seq下游所有翻译组学分析的基础,riboWaltz为我们提供了系统、可视化、易用的解决方案。P-site定位优化:自动识别不同长度RPF的最佳P-site偏移量。三碱基周期性分析:可视化RPF在CDS、UTR等区域的分布,评估数据质量。多样本/多条件支持:可同时处理多个样本,便于批量分析和对比。

1797

【GESP2406六级】计算得分 【GESP2406六级】二叉树

【GESP2406六级】计算得分 【GESP2406六级】二叉树

青少年趣味编程 1222

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

202406 GESP 真题与模拟题

202406 GESP 真题与模拟题

青少年趣味编程 2022

WINCC7.3破解文件

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

记——那次难忘的GESP六级考试(202603)+编程题题解

本文记录了作者参加GESP六级考试的全过程,重点描述了备考和考试当天的经历。作者详细列出了自己完成的13道编程题目及解题思路,包括DP、贪心、树状数组等算法题,同时也提到未完成的8道题目。考试当天经历了忘带鼠标的意外,利用触控板继续练习。文章还提到选择题涉及动态规划、树遍历等基础知识,整体展现了作者从紧张备考到从容应考的心路历程,以及面对突发状况的应对能力。

2401_84010520的博客 641

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

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

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

其中(N)是节点总数,(h)是树的高度(层数)。这个选项让新节点s的next指向当前的hs,但随后又把hs更新为hs->next,所以最后hs并不是指向新节点s,逻辑上是不正确的。在链式栈中,新的元素总是插入到链表的头部,也就是说,新节点将成为第一个节点,而之前的第一个节点将成为第二个节点。这个选项仅仅是把hs的下一个节点设为s,并没有更新hs本身,s也没有成为新的栈顶,这样会导致链表结构不正确。这种方式利用了完全二叉树的性质,即除了最后一层外,每一层都是满的,并且最后一层的所有节点尽可能靠左排列。

团爸讲算法 691

动态规划(dp)——完全背包题目

//这是一道完全背包的题,并且需要用一维数组优化空间,否则会MLE #include <bits/stdc++.h> using namespace std; //t表示可以用来采药的时间(相当于背包容量) //m表示草药的数目(相当于物品数量) int t, m; //m<=10^4,t<=10^7 //w[i]表示采摘第i种草药需要花费的时间(相当于背包模型中物品的体积) //v[i]表示第i种草药的价值(相当于背包模型中物品的价值) int w[10001], v[.

ypeijasd的专栏 309

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

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

Mysssone的博客 399

【算法拾光】队列|在每个树⾏中找最⼤值 + 最后⼀块⽯头的重量

本文总结两道经典算法题:一是通过层序遍历(BFS)逐层找最大值,利用队列分层处理,每层维护最大值;二是用大根堆(优先队列)模拟石头碰撞过程,每次取最大两块石头,差值重新入堆,直至剩余一块或无石。前者适用于树的层次遍历,后者适合动态获取最值场景。核心思想:队列用于分层遍历,堆用于高效取极值。

wuqingyigexiaoba的博客 185

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

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

wuqingyigexiaoba的博客 335

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

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

helloagent的博客 315
上一篇: P10377 [GESP202403 六级] 好斗的牛
下一篇: P10722 [GESP202406 六级] 二叉树
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值