Cod sursa(job #989985)

Utilizator primulDarie Sergiu primul Data 27 august 2013 08:40:31
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 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;
}