#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
// Standardowe DP dla plecaka z grupami (można optymalizować)
// Przy N*M <= 300,000 musimy być ostrożni z pamięcią.
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, k;
cin >> n >> m >> k;
vector<ll> dp(k + 1, 0);
for (int i = 0; i < n; ++i) {
vector<ll> current_stack(m);
vector<ll> prefix_sums(m + 1, 0);
for (int j = 0; j < m; ++j) {
cin >> current_stack[j];
prefix_sums[j + 1] = prefix_sums[j] + current_stack[j];
}
// Aktualizacja DP (od tyłu, aby nie użyć tego samego stosu dwa razy)
for (int w = k; w >= 0; --w) {
for (int take = 1; take <= m && take <= w; ++take) {
dp[w] = max(dp[w], dp[w - take] + prefix_sums[take]);
}
}
}
cout << dp[k] << 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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; // Standardowe DP dla plecaka z grupami (można optymalizować) // Przy N*M <= 300,000 musimy być ostrożni z pamięcią. int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m, k; cin >> n >> m >> k; vector<ll> dp(k + 1, 0); for (int i = 0; i < n; ++i) { vector<ll> current_stack(m); vector<ll> prefix_sums(m + 1, 0); for (int j = 0; j < m; ++j) { cin >> current_stack[j]; prefix_sums[j + 1] = prefix_sums[j] + current_stack[j]; } // Aktualizacja DP (od tyłu, aby nie użyć tego samego stosu dwa razy) for (int w = k; w >= 0; --w) { for (int take = 1; take <= m && take <= w; ++take) { dp[w] = max(dp[w], dp[w - take] + prefix_sums[take]); } } } cout << dp[k] << endl; return 0; } |
English