【题解】蜈蚣

这是一篇关于利用动态规划解决蜈蚣切割问题的题解,目标是计算将蜈蚣切成多段时,使异或恶心值之和最大。文章介绍了问题背景、输入输出格式,并给出了解题思路和关键引理,包括异或性质的证明和前缀异或的应用。
摘要由CSDN通过智能技术生成

题目

链接

题目背景

一群人在山上遇见了一条蜈蚣

题目描述

在一条山路的转角处,WYH发现了一条有中指一样粗的有N节的蜈蚣。这只蜈蚣马上就吸引了HKE的眼球,HKE深深地爱上了这条魔性的蜈蚣。它的很多对足在前进的时候像波浪一样,颇是有毒。

但是,热爱解剖动物的MZL却准备把蜈蚣切了。HKE很失落,于是MZL承诺不会完全肢解它,只把它的N节切成M段,每一段包含原蜈蚣完整的一节或多节。

HKE看到他心爱的蜈蚣会切掉是会觉得恶心的。蜈蚣的每一节都有一个权值W[i],切下来的一段(W[i],W[i+1],…,W[j])带给HKE的恶心值是W[i] xor W[i+1] xor … xor W[j],这里的xor代表按位异或操作。邪恶的LJC希望HKE受到的总恶心值——也就是每一段子蜈蚣带给HKE的恶心值的和最大,请你求出HKE的最大恶心值。

(注:按位异或,其运算符号在pascal中为xor,在c++中为^或xor;请注意加法与异或运算的优先级先后顺序)

输入格式

第一行,两个整数N,M,表示蜈蚣长N节,切成M段。

第二行N个整数用空格分开,表示蜈蚣每一节的权值W[1],W[2],…,W[n]。

输出格式

一个整数表示最大恶心值。

输入输出样例

输入

5 3
1 2 3 4 5

输出

15

说明/提示

第一段的恶心值为 1 xor 2 = 3

第二段的恶心值为 3 xor 4 = 7

第三段的恶心值为 5

总恶心值为 3+7+5=15。此时为最优解。

对于30%的数据,1≤N≤100,1≤M≤10;

对于100%的数据,1≤N≤1000,1≤M≤100,保证结果在2^30-1内;

题解

首先,如果我们假设我们可以用O(1)的时间复杂度求得a[i] xor a[i+1] xor … a[j](区间xor),那么这就是一道水题

dp[i][j]表示前i节,切成j段的最大恶心值

那么我们枚举在哪里切(k),则dp[i][j]=max(dp[i][j],dp[k][j-1]+F(k,i)
其中的F(k,i)就是我们之前说的区间xor(k xor 到 i)

现在我们来解决这个问题

引理1:a xor a=0
证明:由xor的定义,比较每一位

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值