1 条题解
-
0
详细题解
一、问题转化 给定字符串 由数字块和 '+' 组成,形式为 ++...+,其中每个 是长度在 到 之间的数字串,且只包含数字 ∼。 我们需要将 分割成若干个形如 + 的表达式,每个表达式是原串的连续子串且恰好包含一个 '+',并且整条 的每个字符恰好属于一个表达式。 显然,表达式个数必须等于原串中 '+' 的个数,即 个。
二、分割的唯一结构 为了保证字符串恰好被覆盖,分割方式必然具有以下结构:
- 第一个表达式以完整的 作为左操作数,右操作数是 的一个非空前缀。
- 最后一个表达式以完整的 作为右操作数,左操作数是 的一个非空后缀。
- 对于中间的每一个数字块 ( 从 到 ),它会被切成两个非空部分:前缀 和后缀 。 其中 作为第 个表达式的右操作数, 作为第 个表达式的左操作数。
下图展示了对 时的分割结构(以 为例): 表达式1: + → 123 + 4 表达式2: + → 56 + 7 表达式3: + → 89 + 555 其中 ="456" 被切成 ="4" 和 ="56", ="789" 被切成 ="7" 和 ="89"。
三、总和表达式 设 表示数字串 的十进制数值。那么所有表达式结果的总和为:
$$\text{ans} = val(D_1) + val(D_m) + \sum_{i=2}^{m-1} \big(val(pre_i) + val(suf_i)\big) $$并且对于每个 , 与 的拼接等于 ,即 (字符串拼接)。
四、贪心策略 注意到上式中的每一项 只与 的分割点有关,不同 之间互不影响。因此,要最大化总和,我们只需要对每一个中间块 独立地选择切割点,使得 最大。这种局部的贪心选择可以得到全局最优解。
五、算法步骤
- 读取字符串 ,按 '+' 分割得到数字块列表 。
- 如果 (即原串只有一个 '+'),则无法再做分割,答案直接为 。
- 初始化 。
- 对于 从 到 :
- 令当前块字符串为 ,长度为 。
- 枚举切割点 从 到 ,计算前缀数值 ,后缀数值 。
- 记录 的最大值。
- 将最大值累加到 中。
- 输出 。
六、示例演示 输入: 数字块: ="123", ="456", ="789", ="555" , 中间块 ="456": → → 最大为 中间块 ="789": → → 最大为 总和 。输出 。
七、复杂度分析 每个数字块的长度不超过 ,枚举切割点的次数为 (常数级)。总共有 个块,整体时间复杂度为 ,可以处理 , 的数据。
八、正确性证明 任何合法的分割方案必然具有上述结构,因为字符串必须恰好被不重叠的表达式覆盖,且每个表达式恰好含一个 '+'。第一个 '+' 左侧部分必须完整属于第一个数字块,否则会出现孤立数字。类似地可推出所有块的切分方式。总和表达式中的交叉项相互独立,因此全局最大值等于各独立部分最大值之和,贪心策略正确。
- 1
信息
- ID
- 6827
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者