1 条题解
-
1
本题考察动态规划的状态设计。
如果能够进行正确的状态设计,那么这道题就没有那么难了。由于数组任选一段被异或,那么我们可以把这个数组看做三段——第一段 没有被异或的原数组;第二段 被异或的区间;第三段 没有被异或的原数组。当然,由于异或操作可以不进行,也可能整个数组都被异或,所以每一段的长度都可能为 0。
我们设 为当前位置为 ,正处于数组中的第 段的最大和。 的取值范围是 。那么我们每次就只有两种情况,要么继续保持在这一段,要么走到下一段。
所以对于 来说,它要么从 转移过来,要么从 转移过来,转移的方式有两种,要么选择下一个数字,要么把之前选的所有数字全部舍弃,从 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
- 上传者