#include <bits/stdc++.h> // Tomasz Nowak
using namespace std; // XIII LO Szczecin
using LL = long long; // Poland
#define FOR(i, l, r) for(int i = (l); i <= (r); ++i)
#define REP(i, n) FOR(i, 0, (n) - 1)
constexpr LL inf = 0x3f3f3f3f3f3f3f3f;
LL dp2[200][200][61], dp[200][200][61];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
LL m;
cin >> n >> m;
vector<LL> a(n);
for(LL &ai : a)
cin >> ai;
int mx_bits = 0;
while((1LL << mx_bits) < m + 1)
++mx_bits;
++mx_bits;
vector<LL> pref(n);
REP(i, n) {
if(i != 0)
pref[i] = pref[i - 1];
pref[i] += a[i];
}
auto sum = [&](int l, int r) {
if(l == 0)
return pref[r];
return pref[r] - pref[l - 1];
};
REP(i, n)
REP(j, n)
REP(b, mx_bits)
dp[i][j][b] = dp2[i][j][b] = -inf;
//vector<vector<vector<LL>>> dp2(n, vector<vector<LL>>(n, vector<LL>(mx_bits, -inf))), dp = dp2;
FOR(len, 1, n)
REP(l, n - len + 1) {
int r = l + len - 1;
REP(b, mx_bits) {
if(b == 0) {
if(l == r)
dp[l][r][b] = dp2[l][r][b] = 0;
continue;
}
if(~m & (1LL << (b - 1))) {
dp[l][r][b] = dp[l][r][b - 1];
FOR(first, l, r + 1) {
LL curr = 0;
if(first != l)
curr += dp2[l][first - 1][b - 1];
if(first != r + 1)
curr += dp2[first][r][b - 1] + sum(first, r);
dp2[l][r][b] = max(dp2[l][r][b], curr);
}
}
else {
FOR(first, l, r + 1) {
LL curr2 = 0;
if(first != l)
curr2 += dp2[l][first - 1][b - 1];
LL curr1 = curr2;
if(first != r + 1) {
curr2 += sum(first, r);
curr1 = curr2;
curr2 += dp2[first][r][b - 1];
curr1 += dp[first][r][b - 1];
}
dp2[l][r][b] = max(dp2[l][r][b], curr2);
dp[l][r][b] = max(dp[l][r][b], curr1);
}
}
}
}
cout << dp[0][n - 1][mx_bits - 1];
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <bits/stdc++.h> // Tomasz Nowak using namespace std; // XIII LO Szczecin using LL = long long; // Poland #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) constexpr LL inf = 0x3f3f3f3f3f3f3f3f; LL dp2[200][200][61], dp[200][200][61]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; LL m; cin >> n >> m; vector<LL> a(n); for(LL &ai : a) cin >> ai; int mx_bits = 0; while((1LL << mx_bits) < m + 1) ++mx_bits; ++mx_bits; vector<LL> pref(n); REP(i, n) { if(i != 0) pref[i] = pref[i - 1]; pref[i] += a[i]; } auto sum = [&](int l, int r) { if(l == 0) return pref[r]; return pref[r] - pref[l - 1]; }; REP(i, n) REP(j, n) REP(b, mx_bits) dp[i][j][b] = dp2[i][j][b] = -inf; //vector<vector<vector<LL>>> dp2(n, vector<vector<LL>>(n, vector<LL>(mx_bits, -inf))), dp = dp2; FOR(len, 1, n) REP(l, n - len + 1) { int r = l + len - 1; REP(b, mx_bits) { if(b == 0) { if(l == r) dp[l][r][b] = dp2[l][r][b] = 0; continue; } if(~m & (1LL << (b - 1))) { dp[l][r][b] = dp[l][r][b - 1]; FOR(first, l, r + 1) { LL curr = 0; if(first != l) curr += dp2[l][first - 1][b - 1]; if(first != r + 1) curr += dp2[first][r][b - 1] + sum(first, r); dp2[l][r][b] = max(dp2[l][r][b], curr); } } else { FOR(first, l, r + 1) { LL curr2 = 0; if(first != l) curr2 += dp2[l][first - 1][b - 1]; LL curr1 = curr2; if(first != r + 1) { curr2 += sum(first, r); curr1 = curr2; curr2 += dp2[first][r][b - 1]; curr1 += dp[first][r][b - 1]; } dp2[l][r][b] = max(dp2[l][r][b], curr2); dp[l][r][b] = max(dp[l][r][b], curr1); } } } } cout << dp[0][n - 1][mx_bits - 1]; } |
English