题目背景
IOI2000第一题
题目描述
回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。
比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。
注:此问题区分大小写
输入输出格式
输入格式:一个字符串(0<strlen<=1000)
有且只有一个整数,即最少插入字符数
输入输出样例
这道题本质上还是求最长公共子序列
取字符串的倒序,找他们的最长公共子序列,用总长度减去公共部分就是要加入的字符
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1010
int main()
{
char a[MAXN],b[MAXN];
int dp[MAXN][MAXN]; //dp[i][j]表示一条长度为i,另一条长度为j是的最长公共子序列
memset(dp,0,sizeof(dp));
int i,j;
scanf("%s",a);
int la=strlen(a);
for(i=la-1;i>=0;i--)
{
b[i]=a[la-1-i];
}
b[la]='\0'; //复制的话一定要注意这个结尾。
for(i=1;i<=la;i++)
for(j=1;j<=la;j++)
{
if(a[i-1]==b[j-1]) //a是从0开始,而dp是从1开始
dp[i][j]=dp[i-1][j-1]+1; //dp表示最大的公共子串
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
printf("%d\n",la-dp[la][la]);
return 0;
}