题目描述
给出一个长为 n 的序列 A1,A2,…,An
你需要将序列 A 划分成若干个连续段,一段的权值定义为这段内的所有数的按位或。
你需要恰当地选择划分方案,使得每段的权值之和最大。
求出每段的权值之和的最大值。
输入描述:第一行一个整数 n。接下来一行 n 个整数 A1,A2,…,An
输出描述:一个整数,表示答案。
输入
3
9 6 16
输出
31
说明一种最优的方案是划分成 (9,6) (16)。
备注: 1≤n≤10^5, 0≤An≤10^9
#include<bits/stdc++.h>
using namespace std;
inline int read(register int x=0,register char ch=getchar(),register int f=0){
for(;!isdigit(ch);ch=getchar()) f=ch=='-';
for(; isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f?-x:x;
}
int main(){
int n=read(); long long ans=0;
for(int i=1;i<=n;++i) ans+=read();
return printf("%lld\n",ans),0;
}
解题思路:a|b ≤ a+b,所以最优的划分就是不划分,将所有输入相加得到结果。
例如:9|25 = 1001|0001 1001 = 0001 1001 = 25 < 9+25