Cod sursa(job #988328)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 22 august 2013 15:48:30
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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;
}