Cod sursa(job #542557)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 26 februarie 2011 14:55:17
Problema Pixels Scor 0
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 2.29 kb
#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
#define sh short int
#define NM 105
#define OO 1<<27
sh A[NM][NM][2],C[NM][NM][4],N;
int a[NM][NM][2];

int rez,maxx=-OO;
inline int maxim(int a, int b)
{
	if (a>b)return a;
	return b;
}
inline void citire()
{
	freopen("pixels.in","r",stdin);
	freopen("pixels.out","w",stdout);
	scanf("%hd",&N);
	sh i,j,k;
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j)
			scanf("%hd",&A[i][j][0]);
		
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j)
			scanf("%hd",&A[i][j][1]);
	
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j)
			for (k=0; k<=3; ++k)
				scanf("%hd",&C[i][j][k]);
}
inline void stabilesc(bool ok, sh i, sh j,bool dir)
{
	int maxx=-OO,r1;
	bool ok1=(!ok);
	r1=a[i-1][j][ok1]-(int)C[i][j][0]+a[i][j-1][ok1]-(int)C[i][j][3];
	maxx=maxim(maxx,r1); 
	
	r1=a[i-1][j][ok1]-(int)C[i][j][0]+a[i][j-1][ok];
	maxx=maxim(maxx,r1);
	
	r1=a[i-1][j][ok]+a[i][j-1][ok1]-(int)C[i][j][3];
	maxx=maxim(maxx,r1);
	
	r1=a[i-1][j][ok]+a[i][j-1][ok];
	maxx=maxim(maxx,r1);
	
	a[i][j][ok]=A[i][j][ok]+maxx;
}
inline void probe(int k)
{
	sh i,j;
	for (i=1; i<=N; ++i)
	{
		for (j=1; j<=N; ++j)
			printf("%d ",a[i][j][k]);
		printf("\n");
	}
}
inline void pixeli()
{
	sh i,j,k;
	for (i=1; i<=N; ++i)
	{
		for (j=1; j<=N; ++j)
		{
			stabilesc(1,i,j,0);
			stabilesc(1,i,j,1);
			stabilesc(0,i,j,0);
			stabilesc(0,i,j,1);
		}
	}
	
	printf("%d\n",maxim(a[N][N][0],a[N][N][1]));
	//probe(0);
	//probe(1);
}
/*inline void vad()
{
	sh i,j;
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j)
		{
			rez+=A[i][j][a[i][j]];
			if (i>1)
				if (a[i][j]!=a[i-1][j])
					rez-=C[i][j][0];
			if (j>1)
				if (a[i][j]!=a[i][j-1])
					rez-=C[i][j][3];	
		}
	int r1=rez;
		if (!a[N-1][N])
				r1+=C[N][N][0];
		if (!a[N][N-1])
				r1+=C[N][N][3];	
		r1-=A[N][N][0];
		r1+=A[N][N][1];
	rez=maxim(r1,rez);
}
inline void back(sh x, sh y)
{
	if (x==N&&y==N)
	{
		vad();
		maxx=maxim(maxx,rez);
		return;
	}
	sh i,j;
	for (i=y; i<=N; ++i)
		back(x,i);
	for (i=x; i<=N; ++i)
		for (j=1; j<=N; ++j)
			back(i,j);
	a[x][y]=1;
	for (i=y; i<=N; ++i)
		back(x,i);
	for (i=x+1; i<=N; ++i)
		for (j=1; j<=N; ++j)
			back(i,j);
		
}*/
int main()
{
	citire();
	pixeli();
	//back(1,1);
	return 0;
}