0
点赞
收藏
分享

微信扫一扫

nyoj 37 51nod oj 1092 回文字符串 【LCS变形】

绣文字 2022-11-21 阅读 66



传送门:​​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;
}



举报

相关推荐

0 条评论