#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. Javascript的RegExp对象(转载自网络)

    正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. '***************** ...

  2. ajax跨域请求解决方案

    大家好,今天我们学习了js的跨域请求的解决方案,由于JS中存在同源策略,当请求不同协议名,不同端口号.不同主机名下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 方案一.后台PHP进行 ...

  3. java三级考试理论题

    Java试卷 一.单项选择题: 1. 试题: 在WINDOWS环境下,ODBC在__A____中设置 A. 控制面板 B. 注册表 C. 浏览器 D. 写字板 2. 阅读以下描述: C <jsp ...

  4. Android 开发笔记___textview_聊天室效果

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  5. 模拟制作网易云音乐(AudioContext)

    记得好早前在慕课网上看到一款可视化音乐播放器,当前是觉得很是神奇,还能这么玩.由于当时刚刚转行不久,好多东西看得稀里糊涂不明白,于是趁着现在有时间又重新梳理了一遍,然后参照官网的API模拟做了一款网易 ...

  6. 还原NuGet程序包

    官网:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 在获取团队中的项目或者下载他人的项目Demo后,运行项目有时会提示某些dll找不到 ...

  7. struts2框架的登录制作

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

  8. 新增加的HTTP状态码 -- 103

    IETF公布了新的HTTP状态码-103, 总结一下就是提前预加载(css.js)文档,提升用户的访问速度. Summary: a new status code that lets the serv ...

  9. [Bayesian] “我是bayesian我怕谁”系列 - Gaussian Process

    科班出身,贝叶斯护体,正本清源,故拿”九阳神功“自比,而非邪气十足的”九阴真经“: 现在看来,此前的八层功力都为这第九层作基础: 本系列第九篇,助/祝你早日hold住神功第九重,加入血统纯正的人工智能 ...

  10. mysql数据库第三弹

    mysql数据库知识拓展 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT ...