https://www.luogu.com.cn/problem/P1435
思路:回文串有什么性质?我们假设
s
1
s_1
s1为一个回文串,将其翻转后得到的字符串称为
s
2
s_2
s2,那么显然
s
1
、
s
2
s_1、s_2
s1、s2的最长公共子序列为
l
e
n
(
s
1
)
len(s_1)
len(s1)。这就给了我们启发,我们只要计算出
s
1
、
s
2
s_1、s_2
s1、s2的最长公共子序列,设为
x
x
x,需要插入的最少字符数就等于
l
e
n
(
s
1
)
−
x
len(s_1)-x
len(s1)−x。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pr pair<int,int>
using namespace std;
typedef long long ll;
char s1[1005],s2[1005];
int dp[1005][1005];
int main()
{
scanf("%s",s1+1);
int n=strlen(s1+1);
for(int i=1;i<=n;i++)
s2[i]=s1[n-i+1];
s2[n+1]='\0';
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s1[i]==s2[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",n-dp[n][n]);
return 0;
}