Cod sursa(job #1058805)

Utilizator Robert29FMI Tilica Robert Robert29 Data 15 decembrie 2013 21:31:19
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
FILE*f = fopen("ferma2.in", "r");
FILE*g = fopen("ferma2.out", "w");
int j, sol, n, k, sum, min, a[1001][1001], b[1001][1001], c[1001][1001], d[1001][1001], v[1001][1001];
int main(){
	fscanf(f, "%d%d", &n, &k);
	for (int i = 1; i <= n; ++i)
	for (int j = 1; j <= i; ++j){
		fscanf(f, "%d", &a[i][j]);
		b[i][j] = b[i - 1][j] + a[i][j];
		c[i][j] = c[i][j - 1] + a[i][j];
		d[i][j] = d[i - 1][j - 1] + a[i][j];
		sum += a[i][j];
	}

	int m = n - k;

	for (int i = 1; i <= m; ++i)
	for (int j = 1; j <= i; ++j)
		sol += a[i][j];
	min = v[m][m] = sol;
	for (int i = m + 1; i <= n; ++i){
		for (j = m; j<i; ++j){
			v[i][j] = v[i - 1][j] + c[i][j + 1] - c[i][j - m] - d[i][j + 1] + d[i - m - 1][j - m];
			if (v[i][j]<min)
				min = v[i][j];
		}
		v[i][j] = v[i][j - 1] + d[i][j] - d[i - m - 1][j - m - 1] - b[i][j - m];
		if (v[i][j]<min)
			min = v[i][j];
	}

	fprintf(g, "%d", sum - min);
	fclose(g);
	fclose(f);
	return 0;
}