poj 1159

dp,LCS的应用

//求出输入的字符串和他的回文串的LCS的长度l,用此字符串的长度n-l,即得结果
//还有存储的问题,如果用f[maxn][maxn]存储的话会超内存,可通过滚动数组优化
//因为求当前f[i][j]时可能会用到f[i-1][j-1],f[i-1][j],f[i][j-1],观察发现i,j
//只用到当前的i,i-1,二者可用奇偶性区分,只需用一个f[i%2][j]就可表示,为什么
//不能用f[i][j%2]表示,可通过判定求当前的f[i][j%2]时,f[i-1][j%2]并不是f[i-1][j]
//所以这样做是错误的,但前者却可以通过类似的方法判是正确的,所以只需f[2][maxn]的空间
//就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5002;
const int inf=1<<30;
char s[maxn],p[maxn];
int f[2][maxn];
int main()
{
	int n;
	while(cin>>n)
	{
		getchar();
		int i,j;
		char c;
		for(i=1;i<=n;i++)
		{
			scanf("%c",&c);
			s[i]=c;p[n+1-i]=c;
		}
		s[n+1]='\0';p[n+1]='\0';
		memset(f,0,sizeof(f));
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				f[i%2][j]=inf;
				if(s[i]==p[j])
					f[i%2][j]=f[(i-1)%2][j-1]+1;
				else
					f[i%2][j]=f[(i-1)%2][j]>f[i%2][j-1]?f[(i-1)%2][j]:f[i%2][j-1];
			}
		}
		cout<<n-f[n%2][n]<<endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/lj030/p/3002293.html