Cod sursa(job #636875)

Utilizator sodamngoodSo Damn Good sodamngood Data 20 noiembrie 2011 00:50:17
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.27 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 1024

int N, K, S, sol = 999999999;
int A[maxn][maxn], lin[maxn][maxn], col[maxn][maxn];

int main() {
    FILE *f1=fopen("ferma2.in", "r"), *f2=fopen("ferma2.out", "w");
    int i, j, p, q;

    fscanf(f1, "%d %d\n", &N, &K);
    for(i=1; i<=N; i++) {
         for(j=1; j<=i; j++) {
              fscanf(f1, "%d", &A[i][j]);
              S += A[i][j];
              lin[i][j] = lin[i][j-1] + A[i][j];
         }
    }
    for(i=1; i<=N; i++) {
         for(j=i; j<=N; j++) {
              col[i][j] = col[i][j-1] + A[j][i];
         }
    }

    for(i=1; i<=N; i++) {
         //A[i][1] -> A[i+1][2] -> A[i+2][3] -> ...
         //triunghi de latura N - K
         if(i+N-K-1 > N) break;

         int aux = 0;
         for(j=i; j<=i+N-K-1; j++) {
              aux = aux + lin[j][j-i+1];
         }
         sol = min(sol, aux);


         for(j=1; j<=N; j++) {
              if(i+j+N-K-1 > N) break;

              //(i+j, j+1)
              aux -= (col[j][i+j-1+N-K-1] - col[j][i+j-2]);
              aux += (lin[i+j+N-K-1][j+N-K] - lin[i+j+N-K-1][j]);

              sol = min(sol, aux);
         }
    }

    fprintf(f2, "%d\n", S - sol);

    fclose(f1); fclose(f2);
    return 0;
}