题目背景

IOI2000第一题

题目描述

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

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

注:此问题区分大小写

输入格式

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

输出格式

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

输入输出样例

输入:                                                     输出:
Ab3bd

下面是这道题的题解:


这道题我一共有两种解法,下面我会把这两种解法都分享给大家:

第一种解法

第一种解法是用dp来解:

解题思路:这道题可以看做是一道求最长公共子序列的一道题(经典dp问题)!

为什么这么说呢,首先,回文串的特性就是正着读反着读都一样,一组对称的字符串。所以我们把这个字符串倒序放置也是和原来一样的。

这仿佛就找到了一个突破口。

正序与倒序“公共”的部分就是我们回文的部分,如果把正序与倒序公共的部分减去你就会惊奇的发现剩余的字符就是你所要添加的字符,也就是所求的正解!

找到解题思路后我们就可以开始写了,最长公共自序列问题是个经典的dp问题,

最容易想到的方法就是开个二维数组dp[i][j],i,j分别代表两种状态;

那么我们的动态转移方程应该就是if(a[i]==b[j])   dp[i][j]=dp[i-1][j-1]+1;

依此即可解出最长公共自序列,用字符串长度减去即是正解

由于我比较懒,下面有不直接粘贴代码了。

如果你想要更优的解法,就可以把二维数组变一维,不过这里就不说了(a了就行了,哪里呢么多事)


第二种解法

一样是dp。。。。。。

不过这次利用的是区间dp。

区间dp就很好理解了。

不解释原因了,直接上思路:

状态:dp[i][j]从i到j区间内最长回文子序列长度。

转移方程:dp[i][j]=dp[i+1][j-1]+2 i和k能配对
           max(dp[i+1][j],dp[i][j-1]) i和k不能配对
状态:dp[i][i]=1
答案:dp[1][n]
复杂度:O(n^2)

下面是是dp部分代码:

for(int len=;len<=n;len++)
{
for(int i=;i<=n-len+;i++)
{
int j=i+len-;
if(a[i]==a[j])
dp[i][j]=dp[i+][j-]+;
else
dp[i][j]=max(dp[i+][j],dp[i][j-]);
}
}

输入问题注意从a[1]开始输入

输出要用总长度-回文长度

下面是全部代码(区间dp)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define inf 100000000
//状态:dp[i][j]从i到j区间内最长回文子序列长度。
//转移方程:dp[i][j]=dp[i+1][j-1]+2 i和k能配对
// max(dp[i+1][j],dp[i][j-1]) i和k不能配对
//状态:dp[i][i]=1
//答案:dp[1][n]
//复杂度:O(n^2)
char a[];
int dp[][];
using namespace std;
int main()
{
scanf("%s",a+);
int n=strlen(a+);
for(int i=;i<=n;i++)
{
dp[i][i]=;
}
for(int len=;len<=n;len++)
{
for(int i=;i<=n-len+;i++)
{
int j=i+len-;
if(a[i]==a[j])
dp[i][j]=dp[i+][j-]+;
else
dp[i][j]=max(dp[i+][j],dp[i][j-]);
}
}
cout<<n-dp[][n];
return ;//不写return 0,考试就爆零
}

最后祝大家AC所有题!

给个赞再走呗?

洛谷P1435 回文子串的更多相关文章

  1. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...

  2. 洛谷P1217回文质数-Prime Palindrome回溯

    P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include &l ...

  3. 洛谷 P1015 回文数 Label:续命模拟QAQ

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  4. 洛谷 P1015 回文数

    #include<iostream> #include<cstdio> #include<cmath> #include<string> #includ ...

  5. 洛谷P1435 回文字串(dp)

    题意 题目链接 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “Ab3bd”插入2个字符后可 ...

  6. 洛谷P1435 回文字串

    题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “A ...

  7. 洛谷 - P1217 - 回文质数 - 枚举

    https://www.luogu.org/problemnew/show/P1217 考虑暴力生成所有的回文数然后再判断是不是质数.注意个位的选择实际上只有4种.所以是 $4*10^3*10^3=4 ...

  8. 洛谷 P2010 回文日期

    Noip2016普及组T2 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期 ...

  9. 洛谷 P2010 回文日期 题解

    P2010 回文日期 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日 ...

随机推荐

  1. 使用SSH工具连接WSL

    简单记录下操作过程 我在微软应用商店下载了Ubuntu 18.04 LTS.但是Windows的命令行太丑,我打算使用SSH工具连接WSL,输入密码一直拒绝连接... 查找资料之后解决了这个问题 双击 ...

  2. MacOS通过ssh连接基于Virtualbox的Ubuntu虚拟机

    以前总是用Windows软件putty进行ssh连接,今天尝试使用macos. 实验环境:主机:macos 10.15.3 客户机:Ubuntu 18.04 默认情况下,Ubuntu没有安装SSH,需 ...

  3. CCCC L3-013. 非常弹的球

    题意: 刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮 ...

  4. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  5. java课程之团队开发冲刺阶段2.1

    一.总结昨天任务 1.由于使用的模拟器,自己没有安卓手机,所以在制作手机静音功能的时候有一些麻烦 2.功能没有完成 二.遇到的困难 1.安卓手机的静音功能分为五个部分的静音,需要每个都要静音 2.当在 ...

  6. 三十、CI框架之使用cookies实现用户登录和退出。

    一.在控制器中,写入3个函数.一个是login用于登录,一个是logout用于退出,一个show用来展示界面. login代码如下: logout和showuser函数如下: 二.我们的登录界面 三. ...

  7. Web前端工程师需要注意的开发规范有哪些?

    从事web前端开发工作我们就需要了解web前端开发的规范,这样才能保证高效快速的完成工作,本篇就和大家分享一下web前端开发工程师需要注意的web前端开发规范有哪些,希望对小伙伴们有所帮助. web前 ...

  8. 支持 UTF-8 中文的串口调试工具

    最近使用 mdk526,编辑设置使用 utf-8,编辑窗口中文正常,但是编译的时候提示 warning: #870-D: invalid multibyte character sequence,解决 ...

  9. 51nod 1393:0和1相等串

    1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. I ...

  10. Vue iview 表单封装验证

    以下内容转自iview社区,仅供自己查看使用 Form表单部分 <div> <Form ref="FormOne" :model="FormOne&qu ...