Cod sursa(job #1240689)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 11 octombrie 2014 22:08:51
Problema Ferma2 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#define MAXN 1000
int m[MAXN+1][MAXN+1], diag[MAXN+1][MAXN+1], lin[MAXN+1][MAXN+1], col[MAXN+1][MAXN+1], d[MAXN+1][MAXN+1], n, k;
inline void read_in(){
    FILE *fin;
    fin=fopen("ferma2.in", "r");
    int i, j;
    fscanf(fin, "%d%d", &n, &k);
    for(i=1; i<=n; i++){
        for(j=1; j<=i; j++){
            fscanf(fin, "%d", &m[i][j]);
        }
    }
    fclose(fin);
}
inline void built_diag(){
    int l, i, j;
    for(l=1; l<=n; l++){
        for(i=l, j=1; i<=n; i++, j++){
            diag[l][j]=diag[l][j-1]+m[i][j];
        }
    }
}
inline void built_lin(){
    int i, j;
    for(i=1; i<=n; i++){
        for(j=1; j<=i; j++){
            lin[i][j]=lin[i][j-1]+m[i][j];
        }
    }
}
inline void built_col(){
    int i, j;
    for(i=1; i<=n; i++){
        for(j=i; j<=n; j++){
            col[j][i]=col[j-1][i]+m[j][i];
        }
    }
}
inline void built_rez(){
    int val, i, l, c;
    val=0;
    for(i=1; i<=k; i++){
        val+=diag[i][n-i+1];
    }
    for(l=0; l<=k; l++){
        d[l][0]=val;
        val=val+lin[n-l][n-k]-diag[k-l][n-k];
        for(c=1; l+c<=k; c++){
            d[l][c]=d[l][c-1]-diag[k-l-c+1][n-k+c]+diag[k-l-c+1][c]+col[n-l][c]-col[k-l][c];
        }
    }
}
inline void print_out(){
    int max, i, j;
    FILE *fout;
    fout=fopen("ferma2.out", "w");
    max=0;
    for(i=0; i<=k; i++){
        for(j=0; j<=k; j++){
            if(max<d[i][j]){
                max=d[i][j];
            }
        }
    }
    fprintf(fout, "%d\n", max);
    fclose(fout);
}
int main(){
    read_in();
    built_diag();
    built_lin();
    built_col();
    built_rez();
    print_out();
    return 0;
}