题目背景

IOI2000第一题

题目描述(题目链接:https://www.luogu.org/problem/P1435)

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

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

注:此问题区分大小写

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

Ab3bd
输出 #1复制

2

题目分析:这道题乍一看与LCS一点关系都没有,但是回文串是正着读和反着读都是一样的,所以就很容易想到将原来的字符串先颠倒过来观察一下
我们先分析下样例:Ab3bd,它的倒序是:db3bA;
你会发现样例的倒序和没倒序之间相同的部分是被b3b,说明它已经是回文不用动,而剩下的(Ad,dA)就是要在其基础上加上(dA,Ad)构成回文,也就是说,添加字母的长度(为构成回文的长度) = 原序列长度-倒序和原序列重叠的长度(已经构成回文的长度);
求重叠的最长长度就用到了LCS
f[i][j]表示串1的i位和串2的j位之前最长公共子序列的长度。

维基百科关于LCS叙述:

根据LCS模板可以得到以下代码:

#include <bits/stdc++.h>

using namespace std;
int f[+][+]; int main()
{
string s,str;
int len;
cin>>str;
len = str.size();
for(int i = ; i <= len-; i++)
s[i] = str[len-i-];
for(int i = ; i<= len-; i++){
for(int j = ; j <= len-; j++){
if(s[i+] == str[j+]){
f[i+][j+] = f[i][j] + ;
}
else{
f[i+][j+] = max(f[i][j+], f[i+][j]);
}
}
}
cout<<len-f[len-][len-];
return ;
}

最新文章

  1. Windows驱动开发技术详解HelloWDM例子win7下无法安装
  2. angularjs—指令input
  3. Python日志logging
  4. 直接在 CSS 中引用 FONTAWESOME 图标(附码表)
  5. 在Mac OS上安装Vagrant和Docker的教程
  6. int除以int 得到double类型值
  7. 针对安卓java入门:运算符和表达式
  8. bzoj1832
  9. Manage Spring Boot Logs with Elasticsearch, Logstash and Kibana
  10. QTableView 添加进度条 添加按钮 TreeWidget 增删改
  11. Java 多态 父类和子类方法的访问控制权限
  12. 1317: Square(DFS+剪枝)
  13. 递归求和1到n
  14. php获取中文字符拼音首字母
  15. :target方法实现切换
  16. Redis扩展
  17. java面向对象编程(三)--this
  18. 去掉ambiguous expansion of macro警告
  19. ASP.NET Identity详解
  20. Android通讯录管理(获取联系人、通话记录、短信消息)

热门文章

  1. php学习之始于html——div布局与css控制
  2. 《Airbnb 早期BP》---创业学习--训练营直播第3课--HHR
  3. Java面向对象编程 -3.3
  4. 「Luogu P1975 [国家集训队]排队」
  5. js判断ie和edge是否安装Adobe Reader PDF阅读器
  6. [ DLPytorch ] 循环神经网络进阶&amp;拟合问题&amp;梯度消失与爆炸
  7. 栈的python实现
  8. 最全Python学习路线图【2020最新版】
  9. RuntimeError: cuda runtime error (10) : invalid device ordinal
  10. Spring Boot Security JWT 整合实现前后端分离认证示例