Cod sursa(job #2506132)

Utilizator Ykm911Ichim Stefan Ykm911 Data 7 decembrie 2019 16:10:46
Problema Ferma2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define NMax 1005

using namespace std;

ifstream fin("ferma2.in");
ofstream fout("ferma2.out");

int n, k, a[NMax][NMax], diag[NMax][NMax], lin[NMax][NMax], col[NMax][NMax];
int suma, Min;

/**
5 3
82
55 3
67 46 52
62 20 54 85
66 32 40 78 52
*/

void Citire()
{
    fin >> n >> k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= i; j++)
        {
            fin >> a[i][j];
            suma += a[i][j];
            lin[i][j] = lin[i][j - 1] + a[i][j];
            col[i][j] = col[i - 1][j] + a[i][j];
            diag[i][j] = diag[i - 1][j - 1] + a[i][j];
        }
}

void Rezolvare()
{
    int i, j;
    k = n - k;
    ///luam triunghiuri isoscele de sus in jos de k linii si k coloane si il gasim
    ///pe cel cu suma parcelelor cea mai mica dupa af (suma - suma tr)
    int Min, Sum; ///S - suma tr in care ne aflam, Min - suma min din tr parcurse deja
    int sum = 0;/// s - suma tr cu catena in margine
    ///consideram pr tr minim
    for(i = 1; i <= k; i++)
        sum += lin[i][i];
    Min = Sum = sum;
    ///luam celelalte tri
    for(i = 2; i <= n - k + 1; i++)
    {
        ///intai tri cu catena in margine
        sum += lin[i + k - 1][k] - diag[i + k - 2][k];
        Sum = sum;
        Min = min(Min, Sum);
        ///celelalte care au coltul de sus pe randul i
        for(j = 2; j <= i; j++)
        {
            Sum += diag[i + k - 1][j + k - 1] - diag[i - 1][j - 1] - col[i + k - 1][j - 1] + col[i - 1][j - 1];
            Min = min(Sum, Min);
        }
    }
    fout << suma - Min;
}

int main()
{
    Citire();
    Rezolvare();
    fin.close();
    fout.close();
    return 0;
}