题目:https://www.nowcoder.com/acm/contest/90/D
题意:
求最长回文子序列(注意不是子串)
分析:
法一:直接O(n^2) DP
f[i][j] = max( f[i+1][j] , f[i][j-1] , f[i+1][j-1]+2 ) , s[i]==s[j]
= max( f[i+1][j] , f[i][j-1] ) , s[i]!=s[j]
法二:将原串复制一份并翻转,求两串的LCS
代码:
#include <bits/stdc++.h>
using namespace std;
const int tmax=1240;
char s[tmax];
int f[tmax][tmax],len;
void work()
{
int i,j;
for(i=len-1;i>=0;i--)
{
f[i][i]=1;
for(j=i+1;j<len;j++)
{
if(s[i]==s[j]) f[i][j]=f[i+1][j-1]+2;
f[i][j]=max(f[i][j],f[i][j-1]);
f[i][j]=max(f[i][j],f[i+1][j]);
}
}
return;
}
int main()
{
int i;
while(scanf("%s",s)==1)
{
memset(f,0,sizeof(f));
len=strlen(s);
for(i=0;i<len;i++)
if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-'A'+'a';
work();
printf("%d\n",len-f[0][len-1]);
}
return 0;
}