Cod sursa(job #2900090)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 10 mai 2022 09:25:42
Problema Ferma2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#define MAXN 1002
#define LIN 0
#define COL 1

static inline int min( const int& a, const int& b ) {
	return ( a <= b ? a : b );
}

int sum[ 2 ][ MAXN ][ MAXN ];
int dp[ MAXN ][ MAXN ];
int n, k, x;
int S;

int suma( int lin, int col, const int POZ ) {
	if( lin > 0 && col > 0 )
		return sum[ POZ ][ lin ][ col ];
	else return 0;
}

int main() 
{
	FILE *fin = fopen( "ferma2.in", "r" );
	fscanf( fin, "%d %d", &n, &k );
	for( int l = 1; l <= n; l++ )
		for( int c = 1; c <= l; c++ ) {
			fscanf( fin, "%d", &x );
			sum[ LIN ][ l ][ c ] += sum[ LIN ][ l ][ c - 1 ] + x;
			sum[ COL ][ l ][ c ] += sum[ COL ][ l - 1 ][ c ] + x;
			S += x;
		}
	fclose( fin );

	int N = n - k;
	for( int l = 1; l <= n; l++ )
		for( int c = 1; c <= l; c++ )
			dp[ l ][ c ] = dp[ l - 1 ][ c - 1 ] + suma( l, c, LIN ) - suma( l, c - N, LIN ) - suma( l - 1, c - N, COL ) + suma( l - N - 1, c - N, COL ); 

	int minn = dp[ n ][ n ];
	for( int l = N; l <= n; l++ )
		for( int c = N; c <= l; c++ )
			minn = min( minn, dp[ l ][ c ] );
	S -= minn;

	FILE *fout = fopen( "ferma2.out", "w" );
	fprintf( fout, "%d\n", S );
	fclose( fout );
	return 0;
}