序列划分
题目描述
给出一个长为 n 的序列 A 1 A_1 A1, A 2 A_2 A2, … \dots …, A n A_n An。
你需要将序列 A 划分成若干个连续段,一段的权值定义为这段内的所有数的按位或。
你需要恰当地选择划分方案,使得每段的权值之和最大。
求出每段的权值之和的最大值。
输入描述:
第一行一个整数 n。
接下来一行 n 个整数 A 1 A_1 A1, A 2 A_2 A2, … \dots …, A n A_n An。
输出描述:
一个整数,表示答案。
示例1
输入
3
9 6 16
输出
31
说明
一种最优的方案是划分成 (9,6) (16)。
思路:a|b ≤ a+b |
- 由位运算可知a|b ≤ a+b;
- 所以最优的划分就是每个元素都是一个集合,将所有元素相加得到的结果就是最优的。
#include<cstdio>
int a,n;
long long res;
int main(){
res = 0;
scanf("%d",&n);
while(n--){
scanf("%d",&a);
res += a;
}
printf("%lld\n",res);
return 0;
}