Cod sursa(job #1355203)

Utilizator timicsIoana Tamas timics Data 22 februarie 2015 15:09:27
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#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;
}