daimayuan 665. 数组划分

题意:

给定 n 个整数,将其划分为恰好 k 个(连续)子数组,求对每个子数组求和后按与运算的最大值。

\(1\le k \le n\le 100,0\le a_i\le 2^{50}\)

思路:

按位贪心,dp判断

\(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;
}

posted @ 2022-03-29 20:04  Bellala  阅读(107)  评论(0)    收藏  举报