Pagini recente » Cod sursa (job #348686) | Cod sursa (job #2845990) | Cod sursa (job #1616326) | Cod sursa (job #44327) | Cod sursa (job #1355203)
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int N,M,T,d[330][330],v[330][330],s[330][330],ma[330][330],F[330][330],ret;
int main() {
freopen("livada2.in","r",stdin);
freopen("livada2.out","w",stdout);
//freopen("input.in","r",stdin);
scanf("%d",&T);
while(T--) {
int mm = -10000;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i) {
for(int j=1;j<=M;++j) {
scanf("%d",&v[i][j]);
mm = max(mm,v[i][j]);
s[i][j] = s[i][j-1] + v[i][j];
d[i][j] = v[i][j]; //himself
}
}
for(int i=1;i<=M;++i) {
for(int j=1;j<=M;++j) {
F[i][j] = 0;
ma[i][j] = 0;
}
}
if(mm<=0) {
printf("%d\n",mm);
continue;
}
ret = 0;
for(int i=1;i<=N;++i) {
//F[a][j] = max cu b>=j din ma[a][b]+s[i][b]-s[i][a-1] unde a<=j
for(int a=1;a<=M;++a) {
F[a][M] = ma[a][M] + s[i][M] - s[i][a-1];
for(int j=M-1;j>=a;--j) {
F[a][j] = max(F[a][j+1],ma[a][j]+s[i][j] - s[i][a-1]);
}
}
for(int j=1;j<=M;++j) {
for(int a=1;a<=j;++a) { //d[i][j] = max(a<=j, b>=j din ma[a][b]+s[i][b] - s[i][b-1]
d[i][j] = max(d[i][j],F[a][j]);
}
ret = max(ret,d[i][j]); //ret is the maximum d[i][j] encountered
}
for(int a=1;a<=M;++a) {
for(int b=a;b<=M;++b) {
ma[a][b] = 0;
}
}
for(int a=1;a<=M;++a) { //ma[a][b] = max(d[i][a]...d[i][b])
for(int b=a;b<=M;++b) {
ma[a][b] = max(ma[a][b-1],d[i][b]);
}
}
}
printf("%d\n",ret);
}
return 0;
}