Cod sursa(job #1320071)

Utilizator heracleRadu Muntean heracle Data 17 ianuarie 2015 16:08:57
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>

FILE* in=fopen("ferma2.in","r");
FILE* out=fopen("ferma2.out","w");

const int Q=1007;

int n,k;

int v[Q][Q];

int sum;

int spl[Q][Q],spc[Q][Q],spd[Q][Q];

struct tipe{
    int x,y,sum;
} t[2*Q];


int main()
{
    fscanf(in,"%d%d",&n,&k);

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=i; j++)
        {
            fscanf(in,"%d",&v[i][j]);

            spl[i][j]=v[i][j]+spl[i][j-1];
            spc[i][j]=v[i][j]+spc[i-1][j];
            spd[i][j]=v[i][j]+spd[i-1][j-1];

            sum+=v[i][j];
        }
    }

    int d=n-k;

    int nr=0;

    for(int i=d; i<=n; i++)
    {
        nr++;
        t[nr].x=i;
        t[nr].y=1;

        for(int j=i-d+1; j<=i; j++)
        {
            t[nr].sum+=spl[j][j-(i-d)];
        }
    }
/*
    int lung;

    for(int i=d+1; i<=n; i++)
    {
        nr++;
        t[nr].x=n;
        t[nr].y=i-d+1;

        lung=d;

        for(int j=i-d+1; j<=i; j++)
        {
            t[nr].sum+=spc[n][j]-spc[n-lung][j];
            lung--;
        }
    }
*/
    int min=2000000000;

    for(int i=1; i<=nr; i++)
        if(t[i].sum<min)
            min=t[i].sum;

    bool cont=1;

    while(cont)
    {
        cont=0;
        for(int i=1; i<=nr; i++)
        {
            if(t[i].y+1<=i)
            {
                cont=1;

                t[i].sum-=spc[t[i].x][t[i].y]-spc[t[i].x-d][t[i].y];
              //  t[i].sum-=spl[t[i].x][t[i].y+d-1]-spl[t[i].x][t[i].y-1];
              //  t[i].sum+=v[t[i].x][t[i].y];
                t[i].sum+=spd[t[i].x][t[i].y+d]-spd[t[i].x-d][t[i].y];


                t[i].y++;

                if(t[i].sum<min)
                    min=t[i].sum;
            }
        }
    }
    fprintf(out,"%d",sum-min);


    return 0;

}