Cod sursa(job #639236)

Utilizator Catah15Catalin Haidau Catah15 Data 22 noiembrie 2011 20:40:29
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define maXN 1005

int A[maXN][maXN], linie[maXN][maXN], col[maXN][maXN], diag[maXN][maXN];
int sum[maXN][maXN], S;

int main()
{
	freopen ("ferma2.in", "r", stdin);
	freopen ("ferma2.out", "w", stdout);
	
	int N, K;
	
	scanf ("%d %d", &N, &K);
	
	for (int i = 1; i <= N; ++ i)
		for (int j = 1; j <= i; ++ j)
		{
			scanf ("%d", &A[i][j]);
			
			linie[i][j] = linie[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];
			
			S += A[i][j];
		}
	
	int X = N - K;
	
	for (int i = 1; i <= X; ++ i) sum[X][X] += linie[i][i];
	int sol = sum[X][X];
	
	for (int i = X + 1; i <= N; ++ i)
		for (int j = 1; j <= i; ++ j)
		{
			if (j - X >= 0 && i - X >= 0)
				sum[i][j] = sum[i][j - 1] - (col[i][j - X] - col[i - X][j - X]) + diag[i][j] - diag[i - X][j - X];
			else sum[i][j] = sum[i][j - 1] + diag[i][j] - diag[i - X][j - X];
			
			if (i - X >= 0 && j - X >= 0) sol = min (sol, sum[i][j]);
		}

	printf ("%d", S - sol);

	return 0;
}