Cod sursa(job #638489)

Utilizator darrenRares Buhai darren Data 20 noiembrie 2011 21:52:47
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>

using namespace std;

int N, K, Sum, minV;
int A[1002][1002], L[1002][1002], C[1002][1002], D[1002][1002];
int S[1002][1002];

int main()
{
	ifstream fin("ferma2.in");
	ofstream fout("ferma2.out");
	
	fin >> N >> K;
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= i; ++j)
		{
			fin >> A[i][j];
			Sum += A[i][j];
		}
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= N; ++j)
		{
			L[i][j] = L[i][j - 1] + A[i][j];
			C[i][j] = C[i - 1][j] + A[i][j];
			D[i - j + 1][i] = D[i - j + 1][i - 1] + A[i][j];
		}
	
	K = N - K;
	for (int i = 1; i <= K; ++i)
		S[1][1] += L[i][i];
	minV = S[1][1];
	
	for (int i = 2; i <= N - K + 1; ++i)
		for (int j = 1; j <= i; ++j)
		{
			if (j != i)
				S[i][j] = S[i - 1][j] - (D[i - j][i + K - 2] - D[i - j][i - 2]) + (L[i + K - 1][j + K - 1] - L[i + K - 1][j - 1]);
			else
				S[i][j] = S[i][j - 1] - (C[i + K - 1][j - 1] - C[i - 1][j - 1]) + (D[i - j + 1][i + K - 1] - D[i - j + 1][i - 1]);
			minV = min(minV, S[i][j]);
		}
	
	fout << Sum - minV << '\n';
	
	fin.close();
	fout.close();
}