//POJ 1159 Palindrome(动态规划:最长回文子序列)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[2][5050];
int Max(int a,int b)
{
if(a>b)
{
return a;
}
return b;
}
int main()
{
string str1,str2;
int n,i,j;
while(cin>>n)
{
cin>>str1;
str2=str1;
reverse(str1.begin(),str1.end());
memset(dp,0,sizeof(dp));
//===========最长回文子序列=============
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
dp[i%2][j]=Max(dp[(i-1)%2][j],dp[i%2][j-1]);
if(str1[i-1]==str2[j-1])
{
int t=dp[(i-1)%2][j-1]+1;
dp[i%2][j]=max(dp[i%2][j],t);
}
}
}
//====================================
cout<<n-dp[n%2][n]<<endl;
}
return 0;
}
POJ 1159 Palindrome(动态规划:最长回文子序列)
最新推荐文章于 2018-07-30 11:17:44 发布