#include <iostream>
using namespace std;
const int MAX_VALUES = 300;
long long values[MAX_VALUES];
long long partial_sums[MAX_VALUES];
bool precomputed[MAX_VALUES][MAX_VALUES][70];
int precomputed_vals[MAX_VALUES][MAX_VALUES][70];
unsigned long long lower_two_power(unsigned long long v) {
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v |= v >> 32;
v++;
return v / 2;
}
long long bit_count(long long k2) {
long long bits = 0;
for(bits = 0; k2 != 0; ++bits) k2 >>= 1;
return bits;
}
long long compute_result(int left, int right, long long k) {
long long nearest_two_power = lower_two_power(k);
bool k_is_power = (1 << bit_count(k)) == (k + 1);
int bits = bit_count(k + 1);
if (k_is_power && precomputed[left][right][bits]) {
return precomputed_vals[left][right][bits];
}
long long full_result = -1000000000000000000;
if (right - left > (k + 1)) {
return full_result;
}
if (k == 0) {
return 0;
}
if (right == left + 1) {
if (values[left] > 0) {
return values[left] * (bits - 1);
}
else {
return 0;
}
}
for(int i=left+1; i<right; i++) {
long long result1 = compute_result(left, i, nearest_two_power - 1);
long long result2 = compute_result(i, right, k - nearest_two_power);
full_result = max(result1 + result2 + partial_sums[right] - partial_sums[i], full_result);
}
if (k_is_power) {
precomputed[left][right][bits] = true;
precomputed_vals[left][right][bits] = full_result;
}
return full_result;
}
int main() {
long long n, k;
cin >> n >> k;
partial_sums[0] = 0;
for (int i=0; i<n; i++) {
cin >> values[i];
partial_sums[i+1] = partial_sums[i] + values[i];
}
cout << compute_result(0, n, k) << endl;
};
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 | #include <iostream> using namespace std; const int MAX_VALUES = 300; long long values[MAX_VALUES]; long long partial_sums[MAX_VALUES]; bool precomputed[MAX_VALUES][MAX_VALUES][70]; int precomputed_vals[MAX_VALUES][MAX_VALUES][70]; unsigned long long lower_two_power(unsigned long long v) { v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v |= v >> 32; v++; return v / 2; } long long bit_count(long long k2) { long long bits = 0; for(bits = 0; k2 != 0; ++bits) k2 >>= 1; return bits; } long long compute_result(int left, int right, long long k) { long long nearest_two_power = lower_two_power(k); bool k_is_power = (1 << bit_count(k)) == (k + 1); int bits = bit_count(k + 1); if (k_is_power && precomputed[left][right][bits]) { return precomputed_vals[left][right][bits]; } long long full_result = -1000000000000000000; if (right - left > (k + 1)) { return full_result; } if (k == 0) { return 0; } if (right == left + 1) { if (values[left] > 0) { return values[left] * (bits - 1); } else { return 0; } } for(int i=left+1; i<right; i++) { long long result1 = compute_result(left, i, nearest_two_power - 1); long long result2 = compute_result(i, right, k - nearest_two_power); full_result = max(result1 + result2 + partial_sums[right] - partial_sums[i], full_result); } if (k_is_power) { precomputed[left][right][bits] = true; precomputed_vals[left][right][bits] = full_result; } return full_result; } int main() { long long n, k; cin >> n >> k; partial_sums[0] = 0; for (int i=0; i<n; i++) { cin >> values[i]; partial_sums[i+1] = partial_sums[i] + values[i]; } cout << compute_result(0, n, k) << endl; }; |
English