#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, m, k;
vector<vector<ll>> stacks;
ll solve(int l, int r, vector<ll> dp) {
if (l == r) {
ll best = dp[k];
ll currentSum = 0;
for (int i = 1; i <= m && i <= k; ++i) {
currentSum += stacks[l][i - 1];
if (dp[k - i] != -1) {
best = max(best, dp[k - i] + currentSum);
}
}
return best;
}
int mid = (l + r) / 2;
vector<ll> leftSide = dp;
for (int i = mid + 1; i <= r; ++i) {
ll totalSum = 0;
for (ll val : stacks[i]) totalSum += val;
for (int j = k; j >= m; --j) {
if (leftSide[j - m] != -1) {
leftSide[j] = max(leftSide[j], leftSide[j - m] + totalSum);
}
}
}
ll resL = solve(l, mid, leftSide);
vector<ll> rightSide = dp;
for (int i = l; i <= mid; ++i) {
ll totalSum = 0;
for (ll val : stacks[i]) totalSum += val;
for (int j = k; j >= m; --j) {
if (rightSide[j - m] != -1) {
rightSide[j] = max(rightSide[j], rightSide[j - m] + totalSum);
}
}
}
ll resR = solve(mid + 1, r, rightSide);
return max(resL, resR);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
if (!(cin >> n >> m >> k)) return 0;
stacks.assign(n, vector<ll>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> stacks[i][j];
}
}
vector<ll> dp(k + 1, -1);
dp[0] = 0;
cout << solve(0, n - 1, dp) << endl;
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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; int n, m, k; vector<vector<ll>> stacks; ll solve(int l, int r, vector<ll> dp) { if (l == r) { ll best = dp[k]; ll currentSum = 0; for (int i = 1; i <= m && i <= k; ++i) { currentSum += stacks[l][i - 1]; if (dp[k - i] != -1) { best = max(best, dp[k - i] + currentSum); } } return best; } int mid = (l + r) / 2; vector<ll> leftSide = dp; for (int i = mid + 1; i <= r; ++i) { ll totalSum = 0; for (ll val : stacks[i]) totalSum += val; for (int j = k; j >= m; --j) { if (leftSide[j - m] != -1) { leftSide[j] = max(leftSide[j], leftSide[j - m] + totalSum); } } } ll resL = solve(l, mid, leftSide); vector<ll> rightSide = dp; for (int i = l; i <= mid; ++i) { ll totalSum = 0; for (ll val : stacks[i]) totalSum += val; for (int j = k; j >= m; --j) { if (rightSide[j - m] != -1) { rightSide[j] = max(rightSide[j], rightSide[j - m] + totalSum); } } } ll resR = solve(mid + 1, r, rightSide); return max(resL, resR); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); if (!(cin >> n >> m >> k)) return 0; stacks.assign(n, vector<ll>(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> stacks[i][j]; } } vector<ll> dp(k + 1, -1); dp[0] = 0; cout << solve(0, n - 1, dp) << endl; return 0; } |
English