1 条题解

  • 0
    @ 2026-8-28 1:36:32

    题解

    思路

    用前缀和 ss 在 O(1)O(1) 时间求任意长度 mm 段的和。令 dp[j][i]dp[j][i] 表示在前 ii 个元素中恰好选择 jj 段的最大和。不可达状态初始化为负无穷,且 dp[0][i]=0dp[0][i]=0。

    做法

    对每个 j=1…kj=1\ldots k、i=1…ni=1\ldots n,有两种选择:

    1. 不选位置 ii,沿用 dp[j][i−1]dp[j][i-1];
    2. 让一段恰好在 ii 结束。该段为 [i−m+1,i][i-m+1,i],此前的 j−1j-1 段必须位于前 i−mi-m 个位置,所以用 dp[j−1][i−m]+si−si−mdp[j-1][i-m]+s_i-s_{i-m} 转移。

    取两者最大值,答案为 dp[k][n]dp[k][n]。所有和与状态都必须使用 64 位整数。

    正确性证明

    对 jj 与 ii 归纳。任意前 ii 个元素内恰好选择 jj 段的最优方案中,位置 ii 要么未被选择,此时方案完整地属于 dp[j][i−1]dp[j][i-1];要么被选择,此时包含它的最后一段只能是 [i−m+1,i][i-m+1,i],其余 j−1j-1 段完全位于前 i−mi-m 个位置,最优值正是第二项转移。两类情况互斥且覆盖全部合法方案,因此取最大值后 dp[j][i]dp[j][i] 正确。由归纳可知 dp[k][n]dp[k][n] 是恰好选择 kk 段的最大总和。

    复杂度分析

    时间复杂度 O(nk)O(nk)。每一层只依赖上一层,使用滚动数组后空间复杂度为 O(n)O(n)。

    • 1

    信息

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