NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
#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、求最长回文子序列的更多相关文章
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.
洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...
- NOIP2016提高组初赛(2)四、阅读程序写结果2、
#include <iostream> using namespace std; int main() { ][], b[][]; ]; string tmp; , j = , k = , ...
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 3.
*已更新 胡乱分析的第三部分,程序填空(所谓的完善程序) 说到初赛,好像本周六就是了.哇好激动.. 填空题都是玄学.也许get到点了就会好做一些.. (标红的是填在空里的答案) T1.交朋友 (小矮个 ...
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析
最近在做历年的初赛题,那我捡几道比较有代表性的题说一下好了 原题可以在这里看:https://wenku.baidu.com/view/10c0eb7ce53a580217fcfede.html?fr ...
- NOIP2016提高组初赛(1)
一.选择题 6.后缀表达式,使用二叉树来求解,正常情况下的表达式a*(b+c)- d为中序遍历的二叉树. 即 若转换为后缀表达式(左右根)则为abc+*d- 14.代数字进去,多试几遍: 三.问题求解 ...
- NOIP2018提高组初赛准备
NOIP2017提高组初赛错题 一.单项选择题(共15 题,每题1.5 分,共计22.5 分:每题有且仅有一个正确选项) 4. 2017年10月1日是星期日,1949年10月1日是( ). A. 星期 ...
- NOIP2018提高组初赛知识点
(传说,在神秘的初赛中,选手们经常互相爆零以示友好……) 历年真题:ti.luogu.com.cn 以下标题中打*的是我认为的重点内容 一.关于计算机 (一)计算机组成 硬件组成: 1. 控制器(C ...
- NOIP提高组初赛难题总结
NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...
- noip2018提高组初赛试题
一.单项选择题(共 10 题,每题 2 分,共计 20 分: 每题有且仅有一个正确选项) \2. 下列属于解释执行的程序设计语言是( ). A. C B. C++ C. Pascal D. Pytho ...
随机推荐
- CodeForces - 556B Case of Fake Numbers
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- 前端安全之CSRF攻击
前端安全之CSRF攻击 转载请注明出处:unclekeith: 前端安全之CSRF攻击 CSRF定义 CSRF,即(Cross-site request forgery), 中文名为跨站请求伪造.是一 ...
- window.onload,document.ready
执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 编写个数不同 wind ...
- C# join子句
join 子句可用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联. 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值. 例如,食品经销商可能拥有某种产品的供应商列表以及 ...
- js 添加事件 attachEvent 和 addEventListener 的区别
1.addEventListener 适用w3c标准方法addEventListener绑定事件,如下,事件的执行顺序和绑定顺序一致,执行顺序为method1->method2->meth ...
- 最近跟mysql的自动shutdown干上了。。。
数据库变大之后,又开始不定时shutdown了. 搜了半天,也没啥用, 根据谋篇写的内容,改了下一个参数 vi /etc/my.cnf 修改innodb_buffer_pool_size = 16 ...
- selenium-iframe操作
iframe,又叫浮动帧标记,是内嵌的网页元素,可以将一个html文件嵌入到另一个html文件中显示. 最典型的案例就是163邮箱登录:http://mail.163.com/,被绿色覆盖的部分即为i ...
- 《天书夜读:从汇编语言到windows内核编程》九 时间与定时器
1)使用如下自定义函数获取自系统启动后经历的毫秒数:KeQueryTimeIncrement.KeQueryTickCount void MyGetTickCount(PULONG msec) { L ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- 重构手法之Introduce Explaining Variable(引用解释性变量)
返回总目录 6.5Introduce Explaining Variable(引用解释性变量) 概要 你有一个复杂的表达式. 将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表 ...