P1435 回文字串(最长公共子序列)

题目背景

IOI2000第一题

题目描述

回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。

比如 “Ab3bd”插入2个字符后可以变成回文词“dAb3bAd”或“Adb3bdA”,但是插入少于2个的字符无法变成回文词。

注:此问题区分大小写

输入输出格式

输入格式:

一个字符串(0<strlen<=1000)

输出格式:

有且只有一个整数,即最少插入字符数

输入输出样例

输入样例#1:  复制
Ab3bd
输出样例#1:  复制
2



这道题本质上还是求最长公共子序列

取字符串的倒序,找他们的最长公共子序列,用总长度减去公共部分就是要加入的字符

#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;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/81064631