1 条题解

  • 1
    @ 2024-11-2 8:32:34

    本题考察动态规划的状态设计。

    如果能够进行正确的状态设计,那么这道题就没有那么难了。由于数组任选一段被异或,那么我们可以把这个数组看做三段——第一段 没有被异或的原数组;第二段 被异或的区间;第三段 没有被异或的原数组。当然,由于异或操作可以不进行,也可能整个数组都被异或,所以每一段的长度都可能为 0。

    我们设 dpi,jdp_{i,j} 为当前位置为 ii,正处于数组中的第 jj 段的最大和。jj 的取值范围是 131 \sim 3。那么我们每次就只有两种情况,要么继续保持在这一段,要么走到下一段。

    所以对于 dpi,jdp_{i,j} 来说,它要么从 dpi1,jdp_{i-1,j} 转移过来,要么从 dpi1,j1dp_{i-1,j-1} 转移过来,转移的方式有两种,要么选择下一个数字,要么把之前选的所有数字全部舍弃,从 0 开始重新求和,在这两种情况中求 max 即可。

    dp[i][1] = dp[i-1][1] + a; // 第一段只可能从第一段转移过来,第一段是原区间,转移的时候直接加 a 即可
    dp[i][2] = max(0ll, max(dp[i-1][1], dp[i-1][2])) + (a ^ k); // 第二段要么从第一段转移过来,要么从第二段转移过来。由于第二段是被异或的区间,所以转移的时候加上 a ^ k
    dp[i][3] = max(0ll, max(dp[i-1][2], dp[i-1][3])) + a; // 第三段是原数组,转移的时候加 a 即可
    

    由于我们不知道白浅妹妹最终选择的区间是从哪里开始,从哪里结束的,所以如果要输出答案,应该是将所有 dp 值全部求 max,而不是只看最后几个位置的 dp 值。

    • 1

    信息

    ID
    43
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    14
    已通过
    3
    上传者