Cod sursa(job #636068)

Utilizator nandoLicker Nandor nando Data 19 noiembrie 2011 16:49:55
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.25 kb
#include <iostream>
#include <cstdio>
using namespace std;

#define MAXN 1050

inline int min(int a, int b)
{
	return a < b ? a : b;	
}

int n, k, c[MAXN][MAXN], sp[MAXN][MAXN], sd[MAXN][MAXN], sl[MAXN][MAXN], sc[MAXN][MAXN];

FILE* fin = fopen("ferma2.in", "r");
FILE* fout = fopen("ferma2.out", "w");

int main()
{
	fscanf (fin, "%d %d\n", &n, &k);

	int sum = 0, size = n - k;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= i; ++j) {
			fscanf (fin, "%d ", &c[i][j]);
			sum += c[i][j];
			sd[i][j] = sd[i - 1][j - 1] + c[i][j];	
			sc[i][j] = sc[i - 1][j] + c[i][j];
			sl[i][j] = sl[i][j - 1] + c[i][j];
		}	
	}	
	
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= i; ++j) {			
			if (i <= size) {
				sp[size][1] += c[i][j];
			} else {
				if (j == 1) {
					sp[i][1] = sp[i - 1][1] - sd[i - 1][size] + sl[i][size];
				} else if (j <= i - size + 1) {
					sp[i][j] = sp[i][j - 1] - sc[i][j - 1] + sc[i - size][j - 1] + sd[i][j + size - 1] - sd[i - size][j - 1];
				}
			}	
		}	
	}
	
	int minv = 0x3f3f3f3f;
	for (int i = size; i <= n; ++i) {
		for (int j = 1; j <= i - size + 1; ++j) {
			minv = min(minv, sp[i][j]);
		}
	}

	fprintf (fout, "%d\n", sum - minv);

	fclose(fin);
	fclose(fout);
	return 0;
}