#include <bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << " " << x << endl; #define int long long // uważaj const int N = 207, bi = 100; const long long MIN = -4e18; long long dp[N][N][bi]; // l, r, ile bitów do dyspozycji long long pref[N]; long long suf[N][bi]; long long t[N]; inline long long prz(int l, int r) { if(l > r) return 0; return pref[r] - pref[l - 1]; } int max_bit(long long x) { if(x == 0) return 0; int re = 0; while((1ll << re) <= x) re++; return re - 1; } long long max_cnt_bit(long long x) { if(x == 0) return 0; if(__builtin_popcountll(x + 1) == 1) { return max_bit(x) + 1; } else { return max_bit(x); } } void solve() { int n; long long m; cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> t[i]; } if(n == 1) { cout << max(0ll, t[1] * max_cnt_bit(m)) << endl; return; } for(int i = 0; i <= n; i++) { for(int j = 0; j <= n; j++) { for(int k = 0; k <= bi; k++) { dp[i][j][k] = MIN; } } } for(int i = 1; i <= n; i++) { for(int k = 0; k < bi; k++) { dp[i][i][k] = max(t[i] * k, 0ll); } } for(int i = 1; i <= n; i++) { pref[i] = pref[i - 1] + t[i]; } for(int k = 1; k < bi; k++) { for(int l = 1; l <= n; l++) { for(int r = l + 1; r <= n; r++) { dp[l][r][k] = max(dp[l][r][k - 1], dp[l][r][k - 1] + prz(l, r)); for(int pod = l; pod < r; pod++) { dp[l][r][k] = max(dp[l][r][k], dp[l][pod][k - 1] + dp[pod + 1][r][k - 1] + prz(pod + 1, r)); } } } } int bicior = max_bit(m); for(int k = 0; k < bi; k++) { for(int i = 1; i <= n; i++) { suf[i][k] = MIN; } } suf[n][0] = 0; for(int k = 0; k <= bicior; k++) { for(int l = 1; l <= n; l++) { suf[l][k + 1] = suf[l][k]; } if((1ll << k) & m) { for(int l = 1; l <= n; l++) { suf[l][k + 1] = max(suf[l][k] + prz(l, n), suf[l][k + 1]); suf[l][k + 1] = max(dp[l][n][k], suf[l][k + 1]); for(int pod = l; pod < n; pod++) { suf[l][k + 1] = max(suf[l][k + 1], dp[l][pod][k] + suf[pod + 1][k] + prz(pod + 1, n)); } } } } cout << suf[1][bicior + 1] << endl; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test = 1; while(test--){ solve(); } return 0; }
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << " " << x << endl; #define int long long // uważaj const int N = 207, bi = 100; const long long MIN = -4e18; long long dp[N][N][bi]; // l, r, ile bitów do dyspozycji long long pref[N]; long long suf[N][bi]; long long t[N]; inline long long prz(int l, int r) { if(l > r) return 0; return pref[r] - pref[l - 1]; } int max_bit(long long x) { if(x == 0) return 0; int re = 0; while((1ll << re) <= x) re++; return re - 1; } long long max_cnt_bit(long long x) { if(x == 0) return 0; if(__builtin_popcountll(x + 1) == 1) { return max_bit(x) + 1; } else { return max_bit(x); } } void solve() { int n; long long m; cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> t[i]; } if(n == 1) { cout << max(0ll, t[1] * max_cnt_bit(m)) << endl; return; } for(int i = 0; i <= n; i++) { for(int j = 0; j <= n; j++) { for(int k = 0; k <= bi; k++) { dp[i][j][k] = MIN; } } } for(int i = 1; i <= n; i++) { for(int k = 0; k < bi; k++) { dp[i][i][k] = max(t[i] * k, 0ll); } } for(int i = 1; i <= n; i++) { pref[i] = pref[i - 1] + t[i]; } for(int k = 1; k < bi; k++) { for(int l = 1; l <= n; l++) { for(int r = l + 1; r <= n; r++) { dp[l][r][k] = max(dp[l][r][k - 1], dp[l][r][k - 1] + prz(l, r)); for(int pod = l; pod < r; pod++) { dp[l][r][k] = max(dp[l][r][k], dp[l][pod][k - 1] + dp[pod + 1][r][k - 1] + prz(pod + 1, r)); } } } } int bicior = max_bit(m); for(int k = 0; k < bi; k++) { for(int i = 1; i <= n; i++) { suf[i][k] = MIN; } } suf[n][0] = 0; for(int k = 0; k <= bicior; k++) { for(int l = 1; l <= n; l++) { suf[l][k + 1] = suf[l][k]; } if((1ll << k) & m) { for(int l = 1; l <= n; l++) { suf[l][k + 1] = max(suf[l][k] + prz(l, n), suf[l][k + 1]); suf[l][k + 1] = max(dp[l][n][k], suf[l][k + 1]); for(int pod = l; pod < n; pod++) { suf[l][k + 1] = max(suf[l][k + 1], dp[l][pod][k] + suf[pod + 1][k] + prz(pod + 1, n)); } } } } cout << suf[1][bicior + 1] << endl; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test = 1; while(test--){ solve(); } return 0; } |