#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef set<int> SI;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;
const int INF = 1000000001;
const LD EPS = 1e-9;
const int MOD = 1000000007;
const LL LLINF = 1000000000000000001;
#define FOR(i, b, e) for(int i = b; i <= e; i++)
#define FORD(i, b, e) for(int i = b; i >= e; i--)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(x) ((int)(x).size())
#define DPRINT(x) cout << #x << ": " << x << endl
#define BOOST ios_base::sync_with_stdio(false); cin.tie(0)
#define MP make_pair
#define PB push_back
#define ST first
#define ND second
#define GGL(x) "Case #" << x << ": "
// ゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴ
const int maxn = 202;
const int maxmaxbit = 62;
LL v[maxn];
LL vpref[maxn];
LL dpone[maxn][maxn][maxmaxbit];
LL dpans[maxn][maxn][maxmaxbit];
LL n, m;
LL maxbit;
LL segsum(int a, int b)
{
if(b < a)
return 0;
return vpref[b] - vpref[a-1];
}
int main()
{
BOOST;
int n;
cin >> n >> m;
maxbit = 3;
while(LL(1) << maxbit <= m)
maxbit++;
FOR(i, 1, n)
{
cin >> v[i];
vpref[i] = vpref[i-1] + v[i];
}
FOR(i, 1, n)
FOR(j, i+1, n)
FOR(k, 0, maxbit)
{
dpone[i][j][k] = -LLINF;
dpans[i][j][k] = -LLINF;
}
FOR(b, 1, maxbit)
{
FOR(i, 1, n)
dpone[i][i-1][b] = 0;
FOR(i, 1, n)
FOR(j, i, n)
{
FOR(mid, i-1, j)
{
dpone[i][j][b] = max(dpone[i][j][b],
dpone[i][mid][b-1] + dpone[mid+1][j][b-1] + segsum(mid+1, j));
}
dpone[i][j][b] = max(-LLINF, dpone[i][j][b]);
}
}
FOR(b, 1, maxbit)
{
if(m & (LL(1) << (b-1)))
{
FOR(i, 1, n)
FOR(j, 1, n)
{
FOR(mid, i-1, j)
{
dpans[i][j][b] = max(dpans[i][j][b],
dpone[i][mid][b-1] + dpans[mid+1][j][b-1] + segsum(mid+1, j));
}
dpans[i][j][b] = max(-LLINF, dpans[i][j][b]);
}
}
else
{
FOR(i, 1, n)
FOR(j, i, n)
dpans[i][j][b] = dpans[i][j][b-1];
}
}
cout << dpans[1][n][maxbit] << '\n';
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef vector<int> VI; typedef set<int> SI; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; typedef vector<PII> VPII; typedef vector<PLL> VPLL; const int INF = 1000000001; const LD EPS = 1e-9; const int MOD = 1000000007; const LL LLINF = 1000000000000000001; #define FOR(i, b, e) for(int i = b; i <= e; i++) #define FORD(i, b, e) for(int i = b; i >= e; i--) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define DPRINT(x) cout << #x << ": " << x << endl #define BOOST ios_base::sync_with_stdio(false); cin.tie(0) #define MP make_pair #define PB push_back #define ST first #define ND second #define GGL(x) "Case #" << x << ": " // ゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴゴ const int maxn = 202; const int maxmaxbit = 62; LL v[maxn]; LL vpref[maxn]; LL dpone[maxn][maxn][maxmaxbit]; LL dpans[maxn][maxn][maxmaxbit]; LL n, m; LL maxbit; LL segsum(int a, int b) { if(b < a) return 0; return vpref[b] - vpref[a-1]; } int main() { BOOST; int n; cin >> n >> m; maxbit = 3; while(LL(1) << maxbit <= m) maxbit++; FOR(i, 1, n) { cin >> v[i]; vpref[i] = vpref[i-1] + v[i]; } FOR(i, 1, n) FOR(j, i+1, n) FOR(k, 0, maxbit) { dpone[i][j][k] = -LLINF; dpans[i][j][k] = -LLINF; } FOR(b, 1, maxbit) { FOR(i, 1, n) dpone[i][i-1][b] = 0; FOR(i, 1, n) FOR(j, i, n) { FOR(mid, i-1, j) { dpone[i][j][b] = max(dpone[i][j][b], dpone[i][mid][b-1] + dpone[mid+1][j][b-1] + segsum(mid+1, j)); } dpone[i][j][b] = max(-LLINF, dpone[i][j][b]); } } FOR(b, 1, maxbit) { if(m & (LL(1) << (b-1))) { FOR(i, 1, n) FOR(j, 1, n) { FOR(mid, i-1, j) { dpans[i][j][b] = max(dpans[i][j][b], dpone[i][mid][b-1] + dpans[mid+1][j][b-1] + segsum(mid+1, j)); } dpans[i][j][b] = max(-LLINF, dpans[i][j][b]); } } else { FOR(i, 1, n) FOR(j, i, n) dpans[i][j][b] = dpans[i][j][b-1]; } } cout << dpans[1][n][maxbit] << '\n'; } |
English