Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define MAX 5000
- #define inf (1<<29)
- typedef long long int LL;
- int sq[MAX+10];
- LL dp[MAX+10][MAX+10];
- int cor[MAX+10];
- vector<int> idx[MAX+10], val[MAX+10];
- int main()
- {
- int i, j, k, n, pt, cur,p, t;
- scanf("%d", &t);
- while(t--)
- {
- scanf("%d %d", &n, &pt);
- for(i = 1; i <= n; i++)
- scanf("%d", &sq[i]), cor[i] = sq[i] | cor[i-1];
- for(j = 1; j <= n; j++, cur = 0)
- {
- for(i = j; i >= 1; i--)
- {
- cur |= sq[i];
- if(val[j].empty() || val[j].back() != cur)
- {
- val[j].push_back(cur);
- idx[j].push_back(i);
- }
- }
- }
- for(k = 1; k <= pt; k++)
- for(p = 0; p <= n; p++)
- if(p < k) dp[p][k] = -inf;
- else if(k == 1) dp[p][k] = cor[p];
- else
- {
- dp[p][k] = -inf;
- for(i = 0 ; i < idx[p].size(); i++)
- {
- if(idx[p][i]-1 < k-1) break;
- dp[p][k] = max(dp[p][k], dp[idx[p][i]-1][k-1] + val[p][i]);
- }
- }
- printf("%lld\n", dp[n][pt]);
- for(i = 1; i<= n; i++)
- val[i].clear(), idx[i].clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement