#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf =1e18;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,m,k;
cin>>n>>m>>k;
vector<pair<ll, vector<ll>>> vinc;
vector<ll>dec;
vinc.push_back({0, vector<ll>(m+1, 0)});
for(int i=1;i<=n;i++) {
vector<ll>v(m+1);
ll sum=0;
for(int j=1;j<=m;j++) {
cin>>v[j];
sum+=v[j];
}
if (v[1]>=v[m]) {
for (int i=1; i<=m; i++) dec.push_back(v[i]);
}
else {
vinc.push_back({sum, v});
}
}
sort(dec.begin(), dec.end(), greater<ll>());
vector<ll>bestdec(k+1, 0);
for (int i=1; i<=min(k, (int)dec.size()); i++) {
bestdec[i]=dec[i-1] + bestdec[i-1];
}
sort(vinc.begin()+1, vinc.end(), [](const pair<ll, vector<ll>> &a, const pair<ll, vector<ll>> &b) {
return a.first > b.first;
});
vector<ll>bestinc(k+1 + m, 0);
vector<vector<ll>> pref(n+1);
vector<vector<ll>> bestrem(n+1);
vector<int> bestpref(m+1);
n = (int)vinc.size()-1;
bestrem[0]=vector<ll>(m+1, -inf);
pref[0]=vector<ll>(m+1, 0);
for (int i=1; i<=n; i++) {
pref[i]=vector<ll>(m+1, 0);
bestrem[i]=vector<ll>(m+1, 0);
bestrem[i][0]=max(bestrem[i-1][0], -vinc[i].first);
for (int j=1; j<=m; j++) {
pref[i][j]=pref[i][j-1] + vinc[i].second[j];
bestrem[i][j]=max(bestrem[i-1][j], -vinc[i].first + pref[i][j]);
if (pref[i][j] > pref[bestpref[j]][j]) bestpref[j]=i;
}
}
vector<vector<ll>>bestsuf(n+2, vector<ll>(m+1, -inf));
for (int j=m-1; j>=1; j--) {
for (int i=n; i>=1; i--) {
bestsuf[i][j]=max(bestsuf[i+1][j], pref[i][j]);
}
}
for (int i=0; i<=m-1; i++) {
ll sum = 0;
bestinc[i]=pref[bestpref[i]][i];
for (int j=1; j<=k/m; j++) {
if (j>=vinc.size()) {
continue;
}
sum+=vinc[j].first;
if (i==0) {bestinc[j*m]=sum; continue;}
bestinc[i + j * m]=-inf;
if (j+1<vinc.size()) bestinc[i + j * m]=sum + bestrem[j][i] + vinc[j+1].first;
if (j+1<bestsuf.size()) bestinc[i + j * m]=max(bestinc[i + j * m], sum + bestsuf[j+1][i]);
if (bestpref[i]>j) {
bestinc[i + j * m]=max(bestinc[i + j * m], sum + pref[bestpref[i]][i]);
}
}
}
ll res=0;
for (int i=0; i<=k; i++) {
res=max(res,bestinc[i] + bestdec[k - i]);
}
cout<<res<<'\n';
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll inf =1e18; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n,m,k; cin>>n>>m>>k; vector<pair<ll, vector<ll>>> vinc; vector<ll>dec; vinc.push_back({0, vector<ll>(m+1, 0)}); for(int i=1;i<=n;i++) { vector<ll>v(m+1); ll sum=0; for(int j=1;j<=m;j++) { cin>>v[j]; sum+=v[j]; } if (v[1]>=v[m]) { for (int i=1; i<=m; i++) dec.push_back(v[i]); } else { vinc.push_back({sum, v}); } } sort(dec.begin(), dec.end(), greater<ll>()); vector<ll>bestdec(k+1, 0); for (int i=1; i<=min(k, (int)dec.size()); i++) { bestdec[i]=dec[i-1] + bestdec[i-1]; } sort(vinc.begin()+1, vinc.end(), [](const pair<ll, vector<ll>> &a, const pair<ll, vector<ll>> &b) { return a.first > b.first; }); vector<ll>bestinc(k+1 + m, 0); vector<vector<ll>> pref(n+1); vector<vector<ll>> bestrem(n+1); vector<int> bestpref(m+1); n = (int)vinc.size()-1; bestrem[0]=vector<ll>(m+1, -inf); pref[0]=vector<ll>(m+1, 0); for (int i=1; i<=n; i++) { pref[i]=vector<ll>(m+1, 0); bestrem[i]=vector<ll>(m+1, 0); bestrem[i][0]=max(bestrem[i-1][0], -vinc[i].first); for (int j=1; j<=m; j++) { pref[i][j]=pref[i][j-1] + vinc[i].second[j]; bestrem[i][j]=max(bestrem[i-1][j], -vinc[i].first + pref[i][j]); if (pref[i][j] > pref[bestpref[j]][j]) bestpref[j]=i; } } vector<vector<ll>>bestsuf(n+2, vector<ll>(m+1, -inf)); for (int j=m-1; j>=1; j--) { for (int i=n; i>=1; i--) { bestsuf[i][j]=max(bestsuf[i+1][j], pref[i][j]); } } for (int i=0; i<=m-1; i++) { ll sum = 0; bestinc[i]=pref[bestpref[i]][i]; for (int j=1; j<=k/m; j++) { if (j>=vinc.size()) { continue; } sum+=vinc[j].first; if (i==0) {bestinc[j*m]=sum; continue;} bestinc[i + j * m]=-inf; if (j+1<vinc.size()) bestinc[i + j * m]=sum + bestrem[j][i] + vinc[j+1].first; if (j+1<bestsuf.size()) bestinc[i + j * m]=max(bestinc[i + j * m], sum + bestsuf[j+1][i]); if (bestpref[i]>j) { bestinc[i + j * m]=max(bestinc[i + j * m], sum + pref[bestpref[i]][i]); } } } ll res=0; for (int i=0; i<=k; i++) { res=max(res,bestinc[i] + bestdec[k - i]); } cout<<res<<'\n'; return 0; } |
English