#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int n;
int m;
int k;
vector<vector<long long>> sciezka;
unordered_map<long long, long long> memo;
long long findMax(int level, int rest) {
if (level == n || rest == 0) return 0;
if (level == n - 1) {
if (rest > m) rest = m;
return sciezka[level][rest - 1];
}
long long key = 1000000LL * level + rest;
if (auto it = memo.find(key); it != memo.end())
return it->second;
long long maxSum;
maxSum = findMax(level + 1, rest);
int poz = m - 1;
if (rest <= m) poz = rest - 1;
while (poz >= 0) {
if (rest - poz - 1 > (n - level - 1) * m) break;
long long sum = 0;
sum = findMax(level + 1, rest - poz - 1);
sum += sciezka[level][poz];
if (sum > maxSum)
maxSum = sum;
poz--;
}
//cout << "level: " << level << " rest: " << rest << " maxSum: " << maxSum << endl;
memo[key] = maxSum;
return maxSum;
}
int main()
{
long long wynik = 0;
cin >> n >> m >> k;
sciezka.assign(n, vector<long long>(m));
for (int i = 0; i < n; i++) {
long long sum = 0;
for (int j = 0; j < m; j++) {
long long a;
cin >> a;
sum += a;
sciezka[i][j] = sum;
}
}
/*
for (int i = 0; i < n; i++) {
for (int j = 0; j < m ; j++) {
cout << sciezka[i][j] << " ";
}
cout << endl;
}
cout << "=============" << endl;
*/
sort(sciezka.begin(), sciezka.end(),
[](const vector<long long>& a, const vector<long long>& b) {
return a.back() > b.back();
});
/*
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << sciezka[i][j] << " ";
}
cout << endl;
}
cout << "=============" << endl;
*/
if (n == 1) {
wynik = sciezka[0][k - 1];
}
else {
if (m == 1) {
for (int i = 0; i < k; i++)
wynik += sciezka[i][0];
}
else
wynik = findMax(0, k);
}
cout << wynik << 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 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 | #include <iostream> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; int n; int m; int k; vector<vector<long long>> sciezka; unordered_map<long long, long long> memo; long long findMax(int level, int rest) { if (level == n || rest == 0) return 0; if (level == n - 1) { if (rest > m) rest = m; return sciezka[level][rest - 1]; } long long key = 1000000LL * level + rest; if (auto it = memo.find(key); it != memo.end()) return it->second; long long maxSum; maxSum = findMax(level + 1, rest); int poz = m - 1; if (rest <= m) poz = rest - 1; while (poz >= 0) { if (rest - poz - 1 > (n - level - 1) * m) break; long long sum = 0; sum = findMax(level + 1, rest - poz - 1); sum += sciezka[level][poz]; if (sum > maxSum) maxSum = sum; poz--; } //cout << "level: " << level << " rest: " << rest << " maxSum: " << maxSum << endl; memo[key] = maxSum; return maxSum; } int main() { long long wynik = 0; cin >> n >> m >> k; sciezka.assign(n, vector<long long>(m)); for (int i = 0; i < n; i++) { long long sum = 0; for (int j = 0; j < m; j++) { long long a; cin >> a; sum += a; sciezka[i][j] = sum; } } /* for (int i = 0; i < n; i++) { for (int j = 0; j < m ; j++) { cout << sciezka[i][j] << " "; } cout << endl; } cout << "=============" << endl; */ sort(sciezka.begin(), sciezka.end(), [](const vector<long long>& a, const vector<long long>& b) { return a.back() > b.back(); }); /* for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << sciezka[i][j] << " "; } cout << endl; } cout << "=============" << endl; */ if (n == 1) { wynik = sciezka[0][k - 1]; } else { if (m == 1) { for (int i = 0; i < k; i++) wynik += sciezka[i][0]; } else wynik = findMax(0, k); } cout << wynik << endl; } |
English