#include <iostream>
using namespace std;
int lps(string seq, int i, int j) {
int len1, len2;
if (i == j)//当i=j时,则此时扫描到的项是一定可以放入该回文子序列中并且对回文子序列的长度贡献为1
return ;
if (i > j)//当i>j时,即扫描到的左边的数在右边已经扫描过了,所以该项及往后的所有项都是已经扫描过的项,对回文子序列的长度贡献为0
return ;
if (seq[i] == seq[j])//当扫描到相同的字符时
return lps(seq, i + , j - ) + ;//此时这两个相同字符必定可以放入回文子序列中,故总计对回文子序列的长度贡献为2
len1 = lps(seq, i, j - );//如果没有扫描到相同字符,则此时有两种情况,一种是此时的第i个字符对最长回文子序列的长度有贡献
len2 = lps(seq, i + , j);//另一种是此时的第j个字符对最长回文子序列的长度有贡献
if (len1 > len2)//比较上面两种情况的回文子序列的长度大小,返回其中长度较大的回文子序列的长度
return len1;
return len2;
}
int main() {
string seq = "acmerandacm";//给出字符串
int n = seq.size();//统计字符串的长度
cout << lps(seq, , n - ) << endl;//计算最长回文子序列
return ;
}

输出:_________

【一个计算最长回文子序列的例程,值得一背】

  首先是关于扫描的事项

    一是可能有的时候会比较难理解为什么当 i == j 时对回文子序列的贡献为1,例如:abcda,除了头尾的a对回文子序列的贡献为2,中间的bcd不管是怎么扫描,对于a _ a 这个回文子序列来讲,b或c或d是肯定可以填入其中的空格中的,所以对回文子序列的贡献为1

    二是要明白递推公式,除了扫描到相等的项时一定是最长回文子序列中的一部分且对其贡献为2外,那么,当扫描到不相等的两个项时,该怎么想呢?

    对于不相等的两个项 [ i ] [ j ] ,其回文子序列的长度无非两种情况

    ①先扫描 [ i ][ j-1 ] 所得的回文子序列长度比较长  ②先扫描 [ i-1 ][ j ] 所得的回文子序列长度比较长

    那么我们分别递归两种情况,然后比较这两种情况中哪一个回文子序列更长,进而可以求出最长的回文子序列啦

  然后是一些关于阅读程序的心得

    首先,读程序建议从主程序开始读,先大概了解程序后在看函数往往有奇效(反正我是这样感觉的)

     其次,当你阅读程序时,不建议只是扫一遍,最好是能把相应步骤的关键点和一些比较难一眼看出来意义的段落加上注释(可能是因为我还是一个蒟蒻才需要这样做吧......)

     最后,当你对一段程序迷惑时,请你:跟着程序跑一遍-->用编译器再跑一遍-->对于自己有疑虑的点,请造出来然后用编译器跑一遍

     总之,多动手。

     学OI就是一个积累和学习的过程,码得越多,看的越多,就懂得越多。

NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列的更多相关文章

  1. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.

    洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...

  2. NOIP2016提高组初赛(2)四、阅读程序写结果2、

    #include <iostream> using namespace std; int main() { ][], b[][]; ]; string tmp; , j = , k = , ...

  3. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 3.

    *已更新 胡乱分析的第三部分,程序填空(所谓的完善程序) 说到初赛,好像本周六就是了.哇好激动.. 填空题都是玄学.也许get到点了就会好做一些.. (标红的是填在空里的答案) T1.交朋友 (小矮个 ...

  4. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析

    最近在做历年的初赛题,那我捡几道比较有代表性的题说一下好了 原题可以在这里看:https://wenku.baidu.com/view/10c0eb7ce53a580217fcfede.html?fr ...

  5. NOIP2016提高组初赛(1)

    一.选择题 6.后缀表达式,使用二叉树来求解,正常情况下的表达式a*(b+c)- d为中序遍历的二叉树. 即 若转换为后缀表达式(左右根)则为abc+*d- 14.代数字进去,多试几遍: 三.问题求解 ...

  6. NOIP2018提高组初赛准备

    NOIP2017提高组初赛错题 一.单项选择题(共15 题,每题1.5 分,共计22.5 分:每题有且仅有一个正确选项) 4. 2017年10月1日是星期日,1949年10月1日是( ). A. 星期 ...

  7. NOIP2018提高组初赛知识点

     (传说,在神秘的初赛中,选手们经常互相爆零以示友好……) 历年真题:ti.luogu.com.cn 以下标题中打*的是我认为的重点内容 一.关于计算机 (一)计算机组成 硬件组成: 1. 控制器(C ...

  8. NOIP提高组初赛难题总结

    NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...

  9. noip2018提高组初赛试题

    一.单项选择题(共 10 题,每题 2 分,共计 20 分: 每题有且仅有一个正确选项) \2. 下列属于解释执行的程序设计语言是( ). A. C B. C++ C. Pascal D. Pytho ...

随机推荐

  1. Oracle 表空间扩充

    Oracle 表空间扩充 一.现场环境: (1)操作系统:AIX (2)数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - ...

  2. JQ编写楼层效果

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. 2017 ICPC 广西邀请赛1004 Covering

    Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. linux dig 命令

    dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 DNS 信息 dig 命令最典型的用法就是查询单个主机的信息. $ dig baidu.com dig 命令默认的输出信息 ...

  5. Group(), Groups(),& Groupdict()

    group() 返回一个或多个匹配的字串.如果只有一个参数,结果只有单个字符串:如果有多个参数,结果是一个元组,元组里每一项对应一个参数.没有参数,group1默认是0(整个匹配串被返回).如果gro ...

  6. 获取 修改 CSS 样式

    内联(style里的)样式 element.style.color element.style.getPropertyValue("color")   非内联样式 window.g ...

  7. struts2框架的登录制作

    首先:我们要建一个web项目 接着: 我们先来导入struts的xml文件 第一步:右击你的项目名,鼠标到MyEclipse会看到一个add struts开头的文件,点开以后看到: 这里我们选择str ...

  8. JMeter基础教程3:脚本录制篇

    对于一些JMeter初学者来说,录制脚本可能是最容易掌握的技能之一.虽然我不建议录制性能脚本(因为录制的脚本比较混乱,必须要通过二次处理才可正常使用),但有时做总比不做要好,是吧?下面我们详细介绍使用 ...

  9. Markdown简易语法说明

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  10. C#对话框的使用

    [函数] <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon);[函数 ...