构造回文字符串

题目描述

一个字符串是回文字符串当且仅当这个字符串从左向右读和从右向左读是一样的,比如:aba, cddc

现在给定一个字符串,问你,最少添加多少个字符,可以使得字符串变成回文字符串。样例中Ab3bd最少添加2个字符串,如Adb3bdA

输入

第一行输入字符串长度n

第二行输入字符串,仅由字母和数字构成

输出

输出最少添加字符个数

样例输入

5
Ab3bd

样例输出

2

提示

【数据规模和约定】


50%数据  3<=n<=500


100%数据 3<=n<=5000



dp总是能证明我是一个渣渣,什么时候才能真正掌握联赛范围内的dp啊。。。暑假两个月,fighting!

法1:

可以发现一个基本性质:如果把添加改为删除,答案是一样的。所以,把最少的需要删除的那些删掉,剩下的一定是一个回文子序列。

那么回文又有什么性质呢?正反一样,也就是说,原字符串和倒过来的字符串,把最少需要删除的删掉,剩下的一样,so,最长公共子序列呼之欲出。

#include 
#include 
using namespace std; 
int n; 
char a[5005],b[5005]; 
int f[5005][5005]; 
int main() 
{ 
    cin>>n; 
    scanf("%s",a+1); 
    for(int i=1;i<=n;i++) b[i]=a[n-i+1]; 
    for(int i=1;i<=n;i++)  
    for(int j=1;j<=n;j++)  
    if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1; 
    else f[i][j]=max(f[i-1][j],f[i][j-1]); 
    cout<





你可能感兴趣的:(contest)