Cod sursa(job #780319)

Utilizator crushackPopescu Silviu crushack Data 20 august 2012 12:06:07
Problema Divizori Primi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#include <string.h>
#define NMax 5010

const char IN[]="pali.in",OUT[]="pali.out";

int N;
int b[NMax][NMax];
int T[NMax];
char s[NMax];

inline int min(int x,int y){
	return x<y ? x : y;
}

int main()
{
	int i,j;
	freopen(IN,"r",stdin);
	scanf("%s",s+1);
	fclose(stdin);

	N=strlen(s+1);


	for (i=1;i<=N;++i) T[i]=N;
	for (i=1;i<=N;++i)
	{
		b[i][i]=true;
		T[i]=min(T[i],T[i-1]+1);
		for (j=1;i-j>0 && i+j<=N && b[i-j+1][i+j-1];++j) if (s[i-j]==s[i+j])
			b[i-j][i+j]=true,
			T[i+j]=min(T[i+j],T[i-j-1]+1);
		if (i>1 && s[i]==s[i-1])
		{
			b[i][i-1]=true;
			for (j=1;i-j>0 && i+j-1<=N && b[i-j+1][i+j-2];++j) if (s[i-j]==s[i+j-1])
			{
				b[i-j][i+j-1]=true;
				T[i+j-1]=min(T[i+j-1],T[i-j-1]+1);
			}
		}
	}
	/*for (i=1;i<=N;++i) for (j=i;j>0;--j) if (b[j][i])
		T[i]=min(T[i],T[j-1]+1);*/

	freopen(OUT,"w",stdout);
	printf("%d\n",T[N]);
	fclose(stdout);

	return 0;
}