Poj 1159 Palindrome

题目大意:给出一个长度为n的字符串,求最少增加几个字符,使其变成回文串。

思路:一开始没什么想法,后来经过一些模拟举例后发现,增加的字符数量就等于原串的长度减去正序和反序的最长公共子串的差。所以就可以转化为LCS的问题,另外一开始开了5010*5010的空间,结果当然是MLE,后来改成滚动数组,就AC了。

#include <stdio.h>
#include <memory.h>
#include <string.h>
char str1[5010];
char str2[5010];
int n,m;
int dp[2][5010];
int LCS() {
	int i,j,k,ctr;
	
	for (i=1;i<=m;i++) {
		for (j=1;j<=n;j++) {
			if (str1[i]==str2[j])
				dp[i%2][j]=dp[(i-1)%2][j-1]+1;
			else {
				if (dp[(i-1)%2][j]>dp[i%2][j-1])
					dp[i%2][j]=dp[(i-1)%2][j];
				else 
					dp[i%2][j]=dp[i%2][j-1];
			}
		}
	}
	ctr=dp[n%2][n];
	return ctr;
}
int main()
{
	int i,result;

	scanf("%d",&n);
	m=n;
	getchar();
	memset(dp,0,sizeof(dp));
	for (i=1;i<=n;i++) {
		scanf("%c",&str1[i]);
		str2[n-i+1]=str1[i];
	}
	
	result=LCS();
	printf("%d\n",n-result);
	return 0;
}

你可能感兴趣的:(Poj 1159 Palindrome)