Pagini recente » Cod sursa (job #568241) | Borderou de evaluare (job #2679427) | Borderou de evaluare (job #2689737) | Cod sursa (job #2614276) | Cod sursa (job #2506132)
#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;
}