传送门:37
传送门:1092
给一个字符串a, 保持原字符的顺序不变, 至少要加几个字符才能变成回文词
例: abfcbfa 化为 afbcfcbfa
红、绿色表示原字符, 白色为新增字符
显然, s和s’在任何一个位置不可能都是白色(不需要加那个字符!)
应该让红色字符尽量多! 相当于求s和逆序串s’的LCS, 让LCS中的对应字符(红色)对齐, 中间的每个绿色字符都增加一个字符和它相等
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1010][1010];
int main()
{
char a[1010],b[1010];
scanf("%s",a+1);
int ll=strlen(a+1);
for (int i=1;i<=ll;i++)
b[i]=a[ll-i+1];
memset(dp,0,sizeof(dp));
for (int i=1;i<=ll;i++)
for (int j=1;j<=ll;j++)
if (a[i]==b[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",ll-dp[ll][ll]);
return 0;
}