daimayuan 665. 数组划分
题意:
给定 n 个整数,将其划分为恰好 k 个(连续)子数组,求对每个子数组求和后按与运算的最大值。
\(1\le k \le n\le 100,0\le a_i\le 2^{50}\)
思路:
\(dp(i,j)\) 表示把 \(a[1\sim i]\) 划分成 \(j\) 段,价值能否按位大于(即二进制包含) \(x\)
const signed N = 103;
int n, K; ll s[N];
bool f[N][N];
bool ok(ll x) {
memset(f, 0, sizeof f); f[0][0] = 1;
for(int i = 1; i <= n; i++) //[j+1,i]
for(int j = 0; j < i; j++)
for(int k = 0; k < K; k++)
if( ((s[i]-s[j]) & x) == x )
f[i][k+1] |= f[j][k];
return f[n][K];
}
signed main() {
iofast;
cin >> n >> K;
for(int i = 1; i <= n; i++) cin >> s[i], s[i] += s[i-1];
ll ans = 0; //数组的和在2^50 * 100级别
for(int i = 60; i >= 0; i--)
if(ok(ans|(1ll<<i))) ans |= (1ll<<i);
cout << ans;
}

浙公网安备 33010602011771号