P14075 [GESP202509 六级] 划分字符串

5个必知的脑网络图论指标:从聚类系数到小世界特性(附BCT工具包使用指南) 本文深度解析脑网络图论分析中五个核心指标:聚类系数、特征路径长度、全局效率、局部效率及节点效率,并详解其计算与解读。结合Brain Connectivity Toolbox工具包,提供从实战计算、常见报错解决到小世界特性统计检验的完整指南,帮助研究者跨越理论与实操鸿沟,让连接矩阵数据真正服务于神经科学研究。 阅读详情

记录130

#include<bits/stdc++.h>
using namespace std;
#define ll long long//定义长整型别名ll,因为价值a[i]最大可达1e9,累加容易溢出int
const int N=1e5+10;//定义常量N,表示字符串的最大长度
int a[N];//定义数组a,a[i]表示长度为i的合法子串的价值
ll dp[N];//定义dp数组,dp[i]表示前i个字符划分后的最大价值之和
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;//表示字符串的长度
	string s;//定义字符串s,存储输入的n个小写字母
	cin>>n;//读入字符串的长度n
	cin>>s;//读入由n个小写字母组成的字符串s
	for(int i=1;i<=n;i++){//循环读入不同长度子串的价值
		cin>>a[i];//读入长度为i的子串的价值
	}
	for(int i=1;i<=n;i++){//外层循环:遍历字符串的每一个位置(计算前i个字符的最优解)
		bool vis[26]={false};//定义布尔数组vis,用来标记当前子串中26个字母是否出现过
		for(int j=1;j<=i;j++){//内层循环:尝试以第i个字符结尾,向前截取长度为j的子串
			int char_idx=s[i-j]-'a';//计算当前向前截取到的字符在字母表中的下标(0-25)
			if(vis[char_idx])break;//如果这个字符在当前子串中已经出现过,说明再往前延伸不合法,直接跳出循环
			vis[char_idx]=true;//如果没出现过,将其标记为已出现
			dp[i]=max(dp[i],dp[i-j]+a[j]);//状态转移:更新前i个字符的最大价值
		}
	}
	cout<<dp[n];//输出前n个字符(即整个字符串)划分后的最大价值之和
	return 0;//程序结束
}

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


前言

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

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

核心解题思路

这道题是一道结合了字符串合法性约束的线性动态规划(DP)问题。

  1. 状态定义:
    我们定义 dp[i] 表示字符串的前 i 个字符(即 s[0] 到 s[i-1])在满足划分条件下的最大价值之和。

  2. 状态转移:
    为了求出 dp[i],我们需要考虑最后一步划分。假设最后一个子串的长度为 j(即子串为 s[i-j] 到 s[i-1]),那么前 i-j 个字符的最优解是 dp[i-j],当前子串的价值是 a[j]。
    状态转移方程为:dp[i] = max(dp[i], dp[i-j] + a[j])。

  3. 合法性约束与剪枝:
    题目要求每个子串中的字母至多出现一次。这意味着当我们从第 i 个字符向前枚举子串长度 j 时,如果遇到重复字母,不仅当前的 j 不合法,任何比 j 更长的子串(继续向前延伸)也必然包含这个重复字母,因此都不合法。

核心优化:在内层循环中,使用一个大小为 26 的布尔数组 vis 记录当前子串内的字母。一旦发现重复字母,立即 break 跳出内层循环。这个剪枝操作保证了内层循环最多只会执行 26 次(因为只有 26 个小写字母),从而将总时间复杂度从 O(N^2) 降维打击到了 O(26N),完美适配 N=10^5 的数据规模。


代码分块详细解释

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

#include<bits/stdc++.h>
using namespace std;
#define ll long long // 定义长整型别名 ll,因为价值 a[i] 最大可达 1e9,累加容易溢出 int
const int N=1e5+10; // 定义常量 N,表示字符串的最大长度
int a[N]; // 定义数组 a,a[i] 表示长度为 i 的合法子串的价值
ll dp[N]; // 定义 dp 数组,dp[i] 表示前 i 个字符划分后的最大价值之和
  • 详细分析:这部分完成了基础数据结构的搭建。特别需要注意的是 dp 数组使用了 long long 类型。题目中单个子串的价值 a[i] 可达 10^9,在极端情况下(例如 N=10^5),总价值可能会达到 10^14 级别,远超 int 的存储上限(约 2 × 10^9),使用 long long 是防止数据溢出的关键。

2. 输入与 IO 优化

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); // 关闭 C++ 标准流同步,大幅提升大量数据输入输出的效率
    int n; // 表示字符串的长度
    string s; // 定义字符串 s,存储输入的 n 个小写字母
    cin>>n; // 读入字符串的长度 n
    cin>>s; // 读入由 n 个小写字母组成的字符串 s
    for(int i=1;i<=n;i++){ // 循环读入不同长度子串的价值
        cin>>a[i]; // 读入长度为 i 的子串的价值
    }
  • 详细分析:在 N=105 的数据规模下,IO 效率至关重要。ios::sync_with_stdio(false); 和 cin.tie(0); 是竞赛中的标准加速操作。随后,程序依次读入字符串长度、字符串本体以及长度为 1 到 N 的子串价值数组 a,为接下来的动态规划做好数据准备。

3. 核心逻辑:带剪枝的动态规划

    for(int i=1;i<=n;i++){ // 外层循环:遍历字符串的每一个位置(计算前 i 个字符的最优解)
        bool vis[26]={false}; // 定义布尔数组 vis,用来标记当前子串中 26 个字母是否出现过
        for(int j=1;j<=i;j++){ // 内层循环:尝试以第 i 个字符结尾,向前截取长度为 j 的子串
            int char_idx=s[i-j]-'a'; // 计算当前向前截取到的字符在字母表中的下标(0-25)
            if(vis[char_idx]) break; // 核心剪枝:如果这个字符在当前子串中已经出现过,说明再往前延伸不合法,直接跳出循环
            vis[char_idx]=true; // 如果没出现过,将其标记为已出现
            dp[i]=max(dp[i],dp[i-j]+a[j]); // 状态转移:更新前 i 个字符的最大价值
        }
    }
  • 详细分析:这是整个算法的灵魂。
  • 外层循环:自底向上,依次计算 dp[1] 到 dp[n]。
  • 内层循环与合法性检查:内层循环从当前字符 s[i-1] 开始向前回溯。vis 数组在每次外层循环开始时都会被重置。s[i-j]-'a' 巧妙地将字符映射为 0-25 的整数下标。
  • 剪枝的威力:一旦 vis[char_idx] 为真,说明遇到了重复字母。此时 break 直接终止内层循环。因为字母表只有 26 个字母,所以无论字符串多长,内层循环最多只会运行 26 次。这使得原本可能超时的 O(N^2) 算法变成了极其高效的 O(26N) 线性算法。
  • 状态转移:在确保子串合法的前提下,执行 dp[i] = max(dp[i], dp[i-j] + a[j]),将当前子串的价值与历史最优解结合。

4. 输出结果

    cout<<dp[n]; // 输出前 n 个字符(即整个字符串)划分后的最大价值之和
    return 0; // 程序结束
}
  • 详细分析:dp[n] 存储了将整条长度为 n 的字符串进行最优划分后的最大总价值,直接输出即可。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
数据类型#define ll long long使用 64 位长整型防止价值累加时超出 int 范围导致数据溢出
IO 优化ios::sync_with_stdio(false)提升输入输出效率解决 105 级别数据量下 cin/cout 可能导致的超时问题
合法性标记bool vis[26]={false}记录当前子串内的字母快速判断子串是否包含重复字母,保证划分合法
核心剪枝if(vis[char_idx]) break遇重复字母立即终止内层循环将内层循环限制在常数级 (26次),将复杂度从 O(N2) 降为 O(N)
状态转移dp[i] = max(dp[i], dp[i-j]+a[j])线性 DP 核心递推公式将复杂的字符串划分问题,转化为自底向上的最优子结构求解
某城商银行生产容器云平台详细设计方案分享及经验总结 AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。 阅读详情

相关推荐

帕德伯恩大学轴承数据集(PU)介绍

PU数据集介绍一、帕德伯恩大学轴承数据集故障类别说明二、关于损伤描述2.1 损伤组合:2.2 重复和多重损伤的安排:2.3 几何尺寸2.4 损伤程度2.5损伤特征数据集损伤类别三、人为损坏轴承3.1 最常用的人为损伤制造方法是:3.2 本数据集使用的人工损坏是由三种不同方法引起的四、通过加速寿命试验产生真正的轴承损坏样本 一、帕德伯恩大学轴承数据集 数据集下载地址 从帕德伯恩大学获得的PU数据集是一个6203轴承数据集,包括人为诱发的和真实的损害。采用压电加速度计采集轴承座的振动信号,采样频率为64 kHz

m0_47180208的博客 3万+

P14075 [GESP202509 六级] 划分字符串 详细解题报告

设dpidp[i]dpi表示将前缀s0i−1s0i−1(前iii个字符)划分为若干合法子串时,能获得的最大总价值。答案即为dpndp[n]dpn。读入nnn、字符串sss、价值数组aaa。初始化dp00dp[0] = 0dp00。对于i1ni1n清空used数组。从ji−1j = i-1ji−1向左枚举,若sjs[j]sj已出现则break,否则标记并更新dpimax⁡dpid。

weixin_45254471的博客 364

AWVS安装与使用教程

Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的自动化网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型企业的内联网、外延网和面向客户、雇员、厂商和其它人员的Web网站。WVS可以通过检查SQL注入攻击漏洞、XSS跨站脚本攻击漏洞等漏洞来审核Web应用程序的安全性。

qq_59607911的博客 4099

# P14075[GESP202509 六级] 划分字符串

摘要:题目要求将长度为n的字符串划分为若干子串,每个子串中字符只能出现一次,并最大化子串价值之和(价值由长度决定)。使用动态规划解决,定义dp[i]为前i个字符的最大价值。对每个位置i,从后向前检查满足条件的子串,更新dp[i]。时间复杂度O(n²),适用于n≤10⁵的情况。核心思路是维护字符唯一性集合并比较价值,最终输出dp[n]作为结果。

一只高猫的博客 688

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2701

一文入门车载以太网:从原理到实战,看完就能上手开发

新手选型遵循“适配场景、兼顾成本、优先车规”的原则:普通场景(车载娱乐、普通诊断):100Base-T1 PHY(LAN8742)+ 非TSN交换机(SJA1105)+ STM32H743 ECU + 普通STP线缆;ADAS场景:1000Base-T1 PHY(TJA1101)+ TSN交换机(SJA1110)+ NXP S32G399 ECU + 高抗干扰STP线缆;避免过度选型:如普通娱乐场景无需选择TSN交换机、ASIL-B级芯片,否则会增加成本;

getusushu的博客 319

《P14075 [GESP202509 六级] 划分字符串》

题目摘要:给定一个长度为n的小写字母字符串s,要求将其划分为若干子串,每个子串中的字母不重复。同时给出价值数组a,其中a[i]表示长度为i的子串的价值。求所有可能划分中子串价值之和的最大值。 输入包括字符串长度n、字符串s和数组a。输出为最大价值之和。 示例1输入为6,"street",[2,1,7,4,3,3],输出13;示例2输入为8,"blossoms",[1,1,2,3,5,8,13,21],输出8。 数据范围:n≤1e5,a_i≤1e9。需要使用动态规划解决

Jasmine_llq的博客 221

粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解

粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm - EA)。

猫敷雪 893

打卡信奥刷题(2331)用C++实现信奥 P14075 [GESP202509 六级] 划分字符串

摘要:题目P14075要求将一个字符串划分为若干子串,每个子串中字符不重复,并最大化基于子串长度的价值之和。使用动态规划方法,维护一个集合检测字符重复,当无重复时计算最大价值。输入包含字符串长度n、字符串s和价值数组a,输出最大价值。C++实现中通过dp数组记录状态,时间复杂度为O(n^2)。样例输入输出展示了算法有效性。

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

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 277

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

本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!1.:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。2.:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

团爸讲算法 679

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 61

CCF-GESP计算机学会等级考试2025年9月六级C++T1 划分字符串

题目要求将字符串划分为若干子串,每个子串中字母不重复,且子串价值之和最大。采用动态规划解法,定义dp[i]为前i个字符的最大价值。从后往前检查每个可能的子串,若遇重复字符则终止。时间复杂度O(n^2),适用于n≤10^5的情况。输入样例1输出13,样例2输出8。

长春高老师编程 863

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

2401_84010520的博客 641

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

Mysssone的博客 326

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

helloagent的博客 311

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

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

wuqingyigexiaoba的博客 330

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

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序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的博客 602

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

交易逆序对的总数

Wangshijie1015的博客 147

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 24

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 437

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 425

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 173

算法64,字母异位词分组

代码核心思路是:互为字母异位词的字符串,在对其字符进行排序后,一定会得到相同的字符串。因此,可以将排序后的字符串作为哈希表的键(Key)来进行分组。

sheshibenniaodan的博客 195

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 47
上一篇: P13016 [GESP202506 六级] 最大因数
下一篇: P14076 [GESP202509 六级] 货物运输
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值