Cod sursa(job #1184806)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 14 mai 2014 09:44:40
Problema Ferma2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>

const int NMAX = 1005;
const int inf = 0x3f3f3f3f;

using namespace std;
ifstream f("ferma2.in");
ofstream g("ferma2.out");

int N,K,ferma[NMAX][NMAX],summin,sum,total,tr[NMAX][NMAX],x,y;

int triunghi(int x, int y)
{
    int sum = 0;
    for (int i = x; i < x+N-K; ++i)
    {
        for (int j = y; j <= y+i-x; ++j)
        {
            sum += ferma[i][j];
        }
    }
    return sum;
}

int main()
{
    f >> N >> K;
    for (int i = 1; i <= N; ++i)
    {
        for (int j = 1; j <= i; ++j)
        {
            f >> ferma[i][j];
            total += ferma[i][j];
        }
    }

    tr[1][1] = triunghi(1,1);
    summin = tr[1][1];

    for (int i = 2; i+N-K <= N+1; ++i)
    {
        for (int j = 1; j <= i; ++j)
        {
            //triunghi(i,j);
            x = i;
            y = j;

            if (j == 1)
            {

                tr[i][j] = tr[i-1][j];
                for (int ii = x; ii < x+N-K; ++ii)
                {
                    tr[i][j] -= ferma[ii-1][ii-x+1];
                }
                for (int jj = 1; jj <= N-K; ++jj)
                {
                    tr[i][j] += ferma[x+N-K-1][jj];
                }
            }
            else
            {
                tr[i][j] = tr[i][j-1];
                for (int ii = x; ii < x+N-K; ++ii)
                {
                    tr[i][j] += ferma[ii][y+ii-x];
                }
                for (int jj = x; jj < x+N-K; ++jj)
                {
                    tr[i][j] -= ferma[jj][y-1];
                }
            }


            if (tr[i][j] < summin)
                summin = tr[i][j];
        }
    }

    g << total - summin;

    f.close();
    g.close();
    return 0;
}