Cod sursa(job #637598)

Utilizator klamathixMihai Calancea klamathix Data 20 noiembrie 2011 15:27:58
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.1 kb
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 1005;

int i , j , A[maxn][maxn] , oriz[maxn][maxn] , vert[maxn][maxn] , diag[maxn][maxn] , vf[maxn][maxn], Sum;
int n , k;

int main()
{
	freopen("ferma2.in","r",stdin);
	freopen("ferma2.out","w",stdout);
	
	scanf("%d %d",&n,&k);
	
	for ( i = 1 ; i <= n ; ++i )
		for ( j = 1 ; j <= i ; ++j ) {
			scanf("%d",&A[i][j]),
			oriz[i][j] = oriz[i][j - 1] + A[i][j],
			vert[i][j] = vert[i - 1][j] + A[i][j],
			diag[i][j] = diag[i - 1][j - 1] + A[i][j];
			Sum += A[i][j];
		}
		
	
	int l = n - k;
	
	for ( i = 1 ; i <= l ; ++i )
		for ( j = 1 ; j <= i ; ++j )
			vf[1][1] += A[i][j];
	
	int ans = vf[1][1];
		
	for ( i = 2 ; i <= n - l + 1 ; ++i ) {
		vf[i][1] = vf[i - 1][1] - diag[i - 1 + l - 1][l] + oriz[i + l - 1][l];
		
		ans = min ( ans , vf[i][1] );
		
		for ( j = 2 ; j <= i ; ++j ) {
			vf[i][j] = vf[i][j - 1] - (vert[i + l - 1][j - 1] - vert[i - 1][j - 1]) + (diag[i + l - 1][j + l - 1] - diag[i - 1][j - 1]);
			ans = min ( ans , vf[i][j] );
		}
	}
	
	printf("%d\n", Sum - ans);
		
return 0;
}