1 条题解

  • 0
    @ 2026-5-18 23:27:20

    详细题解

    一、问题转化 给定字符串 ss 由数字块和 '+' 组成,形式为 D1D_1+D2D_2+...+DmD_m,其中每个 DiD_i 是长度在 221313 之间的数字串,且只包含数字 1199。 我们需要将 ss 分割成若干个形如 AA+BB 的表达式,每个表达式是原串的连续子串且恰好包含一个 '+',并且整条 ss 的每个字符恰好属于一个表达式。 显然,表达式个数必须等于原串中 '+' 的个数,即 m1m-1 个。

    二、分割的唯一结构 为了保证字符串恰好被覆盖,分割方式必然具有以下结构:

    • 第一个表达式以完整的 D1D_1 作为左操作数,右操作数是 D2D_2 的一个非空前缀。
    • 最后一个表达式以完整的 DmD_m 作为右操作数,左操作数是 Dm1D_{m-1} 的一个非空后缀。
    • 对于中间的每一个数字块 DiD_i (ii22m1m-1),它会被切成两个非空部分:前缀 preipre_i 和后缀 sufisuf_i。 其中 preipre_i 作为第 i1i-1 个表达式的右操作数,sufisuf_i 作为第 ii 个表达式的左操作数。

    下图展示了对 m=4m=4 时的分割结构(以 123+456+789+555123+456+789+555 为例): 表达式1: D1D_1 + pre2pre_2 → 123 + 4 表达式2: suf2suf_2 + pre3pre_3 → 56 + 7 表达式3: suf3suf_3 + D4D_4 → 89 + 555 其中 D2D_2="456" 被切成 pre2pre_2="4" 和 suf2suf_2="56", D3D_3="789" 被切成 pre3pre_3="7" 和 suf3suf_3="89"。

    三、总和表达式 设 val(X)val(X) 表示数字串 XX 的十进制数值。那么所有表达式结果的总和为:

    $$\text{ans} = val(D_1) + val(D_m) + \sum_{i=2}^{m-1} \big(val(pre_i) + val(suf_i)\big) $$

    并且对于每个 iipreipre_isufisuf_i 的拼接等于 DiD_i,即 prei+sufi=Dipre_i + suf_i = D_i(字符串拼接)。

    四、贪心策略 注意到上式中的每一项 val(prei)+val(sufi)val(pre_i) + val(suf_i) 只与 DiD_i 的分割点有关,不同 DiD_i 之间互不影响。因此,要最大化总和,我们只需要对每一个中间块 DiD_i 独立地选择切割点,使得 val(pre)+val(suf)val(pre) + val(suf) 最大。这种局部的贪心选择可以得到全局最优解。

    五、算法步骤

    1. 读取字符串 ss,按 '+' 分割得到数字块列表 D1,D2,,DmD_1, D_2, \dots, D_m
    2. 如果 m=2m = 2(即原串只有一个 '+'),则无法再做分割,答案直接为 val(D1)+val(D2)val(D_1) + val(D_2)
    3. 初始化 ans=val(D1)+val(Dm)ans = val(D_1) + val(D_m)
    4. 对于 ii22m1m-1
      • 令当前块字符串为 tt,长度为 LL
      • 枚举切割点 jj11L1L-1,计算前缀数值 pre=val(t[0..j1])pre = val(t[0..j-1]),后缀数值 suf=val(t[j..L1])suf = val(t[j..L-1])
      • 记录 pre+sufpre + suf 的最大值。
      • 将最大值累加到 ansans 中。
    5. 输出 ansans

    六、示例演示 输入:123+456+789+555123+456+789+555 数字块: D1D_1="123", D2D_2="456", D3D_3="789", D4D_4="555" val(D1)=123val(D_1)=123, val(D4)=555val(D_4)=555 中间块 D2D_2="456": j=1j=14+56=604 + 56 = 60 j=2j=245+6=5145 + 6 = 51 最大为 6060 中间块 D3D_3="789": j=1j=17+89=967 + 89 = 96 j=2j=278+9=8778 + 9 = 87 最大为 9696 总和 ans=123+555+60+96=834ans = 123 + 555 + 60 + 96 = 834。输出 834834

    七、复杂度分析 每个数字块的长度不超过 1313,枚举切割点的次数为 O(L)O(L)(常数级)。总共有 ms/3m \le |s|/3 个块,整体时间复杂度为 O(s)O(|s|),可以处理 t100t \le 100s1000|s| \le 1000 的数据。

    八、正确性证明 任何合法的分割方案必然具有上述结构,因为字符串必须恰好被不重叠的表达式覆盖,且每个表达式恰好含一个 '+'。第一个 '+' 左侧部分必须完整属于第一个数字块,否则会出现孤立数字。类似地可推出所有块的切分方式。总和表达式中的交叉项相互独立,因此全局最大值等于各独立部分最大值之和,贪心策略正确。

    • 1

    信息

    ID
    6827
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者