SSL_1813【回文词】

本文介绍了如何使用动态规划方法解决将给定字符串转化为回文词的问题。通过构建动态规划矩阵,找到前缀和后缀的最大公共子序列,从而确定所需的最小插入字符数。代码实现和详细解释帮助理解解题思路。
摘要由CSDN通过智能技术生成

回文词

题目

回文词是一种对称的字符串,也就是说:一个回文词,从左向右读和从右向左读的结果都是一样的。任意给定一个字符串,通过插入若干个字符,都可以变成一个回文词。你的任务是写一个程序,求出给定字符串变成回文词所需插入的最小字符数。
比如,字符串"Ab3db",在插入两个字符后可以变成一个回文词(“dAb3bAd”,“Adb3bdA”),然而,插入两个以下的字符无法使它变成一个回文词。

Input

输入文件的第一行包含一个数N,表示给定字符串的长度(3<=N<=5000)
文件的第二行是一个长度为N的字符串。字符串仅由大写字母,小写字母,和数字构成。大写字母和小写字母被认为是不同的。

Output

输出只包括一行,包含一个整数,表示需要插入的字符数。

Sample Input

5//我要这东西有何用
Ab3bd

Sample Output

2

解析

动态规划,永远的神!
再次DP,不会忘注解了
f[x][y]表示前x个和后y个的倒序的最大公共子序列
用两个字符串,翻转一个
下面直接上重头戏:动态转移方程
if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1]+1;else f[i][j]=max(f[i-1][j],f[i][j-1]);
(翻转的是b,且1<=i<=a.size(),1<=j<=b.size())
接下来输出n-f[n][n]n-1-2*f[i][i](0<=i<n)
祝大家AC快乐!

code:

#include<iostream>
#include<cstdio>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值