Cod sursa(job #951160)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 19 mai 2013 16:48:12
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define Nmax 1024

int N, K;
int Suma, minim;

int mat[Nmax][Nmax];
int linie[Nmax][Nmax];
int coloana[Nmax][Nmax];
int diag[Nmax][Nmax];
int d[Nmax][Nmax];

void citire(){

    freopen("ferma2.in", "r", stdin);

    scanf("%d %d", &N, &K);

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= i; j++){

            scanf("%d", &mat[i][j]);
            Suma += mat[i][j];
            cout<<mat[i][j]<<" ";
        }

    fclose(stdin);
}

void init(){

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= i; j++){

            linie[i][j] = linie[i][j - 1] + mat[i][j];
            coloana[i][j] = coloana[i - 1][j] + mat[i][j];
            diag[i][j] = diag[i - 1][j - 1] + mat[i][j];
        }

    K = N - K;

    for(int i = 1; i <= K; i++)
        for(int j = 1; j <= i; j++)
            d[1][1] += mat[i][j];

    minim = d[1][1];
}

void dinamica(){

    for(int i = 2; i <= N - K + 1; i++){

        d[i][1] = d[i-1][1] - diag[i + K - 2][K] + linie[i + K - 1][K];
        minim = min(minim, d[i][1]);

        for(int j = 2; j <= i; j++){

            d[i][j] = d[i][j - 1] + diag[i + K - 1][j + K - 1] - diag[i - 1][j - 1] -
                      coloana[i + K - 1][j - 1] + coloana[i - 1][j - 1];

            minim = min(minim, d[i][j]);
        }
    }

}

void afis(){

    freopen("ferma2.out", "w", stdout);

    printf("%d\n", Suma - minim);

    fclose(stdout);
}

int main(){

    citire();
    init();
    dinamica();
    afis();

    return 0;
}