POJ 1159 (DP)

题目:http://poj.org/problem?id=1159

思路:

找出原串的最长回文子串,当然这里说的回文子串可以不连续。用原串的长度减去最长回文子串的长度即可得出结果。

设原串a[5001],它的反串为b[5001],求出a和b的最长公共子串的长度(可以不连续),即为回文子串的长度。再用原串长度减去回文子串的长度即可。

用动态规划求公共子串的长度,m[5001][5001]打表。m[i][j]表示原串a第1个到第i个和反串b第1个到第j个的最长公共子串的长度。所以有两种情况:

(1)当a[i] = b[j]时,m[i][j]=m[i-1][j-1] + 1;

(2) a[i] != b[j]时,m[i][j]=max(m[i-1][j],m[i][j-1])。

 所以m[len][len]就是最长公共子串的长度。(len为原串的长度)

 

 

算法正确性证明:

比如abcdb,最长回文串是bcb或bdb,长度是3,5-3=2,所以只需插入2个即可。为什么呢???

    因为回文串有两种形式aba或者abba,我们暂且把后面那两个b看成是一个,这个没关系的,便于解释。那么一个字符串就分成了两类字符了,一个是回文串,一个是非回文串,假设把回文串的中间那个字符记成b,那么b左边的非回文串和b右边的非回文串就不可能有交集(如果有,那交集部分就会归并到回文串里),所以只需要在左边对称位置插入b右边的非回文字符,在右边插入b左边的非回文字符。所以要插入的字符个数就是非回文字符的个数,非回文字符就是回文字符串对原字符串的补集,故原串长度减去回文串长度即可得解。

 

代码:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5001char a[N],b[N];unsigned short m[N][N];int main()
{int len,i,j,t;while(scanf("%d",&len) != EOF ){scanf("%s",a);                       t = len -1;for(i = len-1; i >= 0 ; --i)b[t-i] = a[i] ;for(i = 1 ; i <= len ; ++i)for(j = 0 ; j < i ; ++j)   m[i][j] = m[j][i] = 0;for(i = 0 ; i <= len ; ++i)m[i][i] = 0;for(i = 1 ; i <= len ; ++i){for(j = 1 ; j <= len ; ++j){if(a[i-1] == b[j-1])m[i][j] = m[i-1][j-1] + 1;elsem[i][j] = m[i-1][j] > m[i][j-1] ? m[i-1][j]:m[i][j-1];}}printf("%d\n",len - m[len][len]);} // system("pause");return 0;
}

 

 

开始用 int m[N][N]; 超内存了!用unsigned short 就AC了。

 

看discuss,人家用滚动数组!汗,落伍了。第一次听说这玩意,于是诚信学习了啊!

 

先贴个最简单的滚动数组的应用:(求Fabonacci数列的第100个数)

int d[3];
d[0]=1;d[1]=1;
for(i=2;i<100;i++)
d[i%3]=d[(i-1)%3]+d[(i-2)%3];
printf("%d",d[99%3]);
注意上面的运算,我们只留了最近的3个解,数组好象在“滚动‿一样,所以叫滚动数组。

好了,这个题就可以用滚动数组+DP AC了。用一个二位的数组m[2][N]。列可以往后展开,行不停的滚动,

滚动方式: i%2,(i-1)%2

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5001unsigned short m[2][N];
char a[N],b[N];int main()
{int len,i,j,t;while(scanf("%d",&len) != EOF ){scanf("%s",a);                       t = len -1;for(i = len-1; i >= 0 ; --i)b[t-i] = a[i] ;for(i = 0 ; i <= len ; ++i)   m[0][i] = m[1][i] = 0;for(i = 1 ; i <= len ; ++i){for(j = 1 ; j <= len ; ++j){if(a[i-1] == b[j-1])m[i%2][j] = m[(i-1)%2][j-1] + 1;elsem[i%2][j] = m[(i-1)%2][j] > m[i%2][j-1] ? m[(i-1)%2][j]:m[i%2][j-1];}}printf("%d\n",len - m[len%2][len]);               } //system("pause");return 0;
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/HpuAcmer/archive/2012/05/03/2481323.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新版本ISR 为啥 移除replica.lag.max.messages这个参数

ISR 上节我们涉及到ISR (In-Sync Replicas)&#xff0c;这个是指副本同步队列。副本数对Kafka的吞吐率是有一定的影响&#xff0c;但极大的增强了可用性。默认情况下Kafka的replica数量为1&#xff0c;即每个partition都有一个唯一的leader&#xff0c;为了确保消息的可靠性&am…

程序员健身的重要性

程序员健身的重要性人的身体就是人的灵魂最好的写照&#xff01; &#xff0d;&#xff0d;&#xff0d; 路德维系.维特根斯坦 健身不仅是保持健康体魄的关键要素之一&#xff0c;也是灵活的、具有创造性的脑力活动的基础。 &#xff0d;&#xff0d;&#xff0d; 约翰.肯尼迪 …

Java 8 中的哈希表

JDK 的代码是开源的&#xff0c;我们打开idea开发工具&#xff0c;引入jdk1.8 找到hashmap HashMap 是基于 HashTable 的一种数据结构&#xff0c;在普通哈希表的基础上&#xff0c;它支持多线程操作以及空的 key 和 value。 在 HashMap 中定义了几个常量: static final in…

NSJSONSerialization介绍

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试&#xff0c;NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。详情见这里。既然apple为我们提供了这么良好的工具&#xff0c;我们没理由不用吧。 NSJSONSeriali…

开始新的blog之旅--flash3,0涂鸦板保存,撤销功能

一直以来都是在百度写的博客&#xff0c;今天不知道百度是哪抽风。居然把我的博客给封了&#xff0c;上贴吧去发泄一番&#xff0c;结果帖子都给删了。 不得不说你百度厉害&#xff0c;你自己犯的错误。让我们这些用户跟着受罪。我看今天很多博客都被封了&#xff0c;都不知道原…

JDK8HashMap的扩容核心解读,尾插法

看懂了JDK7Hashmap的扩容头插法&#xff0c;及其可能产生的循环引用问题&#xff0c;今天看看JDK8的HashMap扩容实现。采取的是用四个结点&#xff0c;两条链表完成重新分配位置&#xff0c;比较简单有趣。解析如下&#xff1a; //如果原来的table等于null&#xff0c;直接返回…

领导者的资质——学习笔记(1)

领导者的资质——学习笔记&#xff08;1&#xff09;《领导者的资质》是稻盛和夫先生著作的一本书&#xff0c;书中的道理值得深深思考和体会&#xff0c;结合自己工作、生活中的一些事情&#xff0c;会有不同的感觉。本学习笔记特此记录书中重点的内容&#xff0c;供以后反复阅…

[转帖]ISE与Modelsim联合观察中间信号

如何仿真IP核&#xff08;建立modelsim仿真库完整解析&#xff09; 来源&#xff1a;http://www.ednchina.com/ART_49023_19_0_AN_7116cf44.HTM IP核生成文件&#xff1a;&#xff08;Xilinx/Altera 同&#xff09; IP核生成器生成 ip 后有两个文件对我们比较有用&#xff0c;假…

计算时间复杂度

步骤&#xff1a; 1、找到执行次数最多的语句 2、语句执行语句的数量级 3、用O表示结果 计算时间复杂度的3个出发点&#xff0c;掌握这三个出发点&#xff0c;那么一向搞不懂的时间复杂度就可以迎刃而解啦。 然后&#xff1a; 1、用常数1取代运行时间中的所有加法常数 2、…

领导者的资质——学习笔记(2):领导者的人格

领导者的资质——学习笔记&#xff08;2&#xff09;&#xff1a;领导者的人格在领导者的资质中&#xff0c;人格最为重要。领导者保持自己高层次的人格&#xff0c;是解决当前企业治理危机最根本性的方略。我们要时时事事思考“作为人&#xff0c;何为正确”不断自问自答&…

sql server 2008学习12 事务和锁

事务 事务的点: 1.begin tran 是事务开始的地方,也是 事务回滚的起点.也就说他会忽略这个起点之后的最终没有提交的所有语句, 2.commit tran 事务的提交 是一个事务的终点 当发出 commit tran命令时,可以认为 该事务是 持久的. 撤销已完成事务的唯一方法 是 发出一个新的事务.…

领导者的资质——学习笔记(3):领导者的十项职责

领导者的资质——学习笔记&#xff08;3&#xff09;&#xff1a;领导者的十项职责领导者必须向员工说明工作的目的意义&#xff0c;设定具体目标&#xff0c;制定相应的计划&#xff0c;怀着强烈的愿望&#xff0c;付出不亚于任何人的努力&#xff0c;表现出坚强的意志&#x…

漫画:什么是时间复杂度?

时间复杂度的意义 究竟什么是时间复杂度呢&#xff1f;让我们来想象一个场景&#xff1a;某一天&#xff0c;小灰和大黄同时加入了一个公司...... 一天过后&#xff0c;小灰和大黄各自交付了代码&#xff0c;两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒&#x…

Eclipse如何连接SQL Server 2005数据库

做管理系统当然少不了经常与数据库打交道&#xff0c;在网上搜了很多数据库版本都不小&#xff0c;大的有好几个G的&#xff0c;小的也有几百兆的&#xff0c;我这可怜的内存&#xff0c;最终找了个精简版中的精简版的Sql server2005&#xff0c;只有80几兆&#xff0c;本来只想…

NLP 最新进展

参考文献&#xff1a; •http://www.dataguru.cn/article-14237-1.html •https://zhuanlan.zhihu.com/p/46652512 •https://github.com/google-research/bert •https://allennlp.org/elmo •https://arxiv.org/pdf/1802.05365 •https://arxiv.org/abs/1810.04805

一句话评论设计模式六大原则

注&#xff1a;转自http://blog.csdn.net/jesse621/article/details/7216331 原则&#xff0c;故名思议则是本质的意思。所谓擒贼先擒王&#xff0c;研究设计模式自然要先了解设计原则&#xff0c;所有的模式都是在这些原则的基础之上发展起来的&#xff0c;有的是侧重一 个&am…

Big GAN

参考文献&#xff1a; •https://github.com/kayamin/DR-GAN •https://www.jianshu.com/p/4ee8f9284b81 •http://cvlab.cse.msu.edu/pdfs/Tran_Yin_Liu_CVPR2017.pdf •https://arxiv.org/abs/1809.11096 •https://juejin.im/entry/5c05e76c51882539c60cf2d5 •https:…

时间复杂度空间复杂度怎么算?

什么是算法 算法的定义是这样的&#xff1a;解题方案的准确而完善的描述&#xff0c;是一系列解决问题的清晰指令。巴拉巴拉的&#xff0c;虽然是一小句但还是不想看&#xff08;题外话&#xff1a;有时候吧专业名词记下来面试的时候还是挺有用的&#xff09;&#xff0c;其实…

什么样的知识,值得我们终生学习

#什么样的知识&#xff0c;值得我们终生学习&#xff1f; 原文&#xff1a;https://dwz.cn/vylyXXJi 一、引言 可能你从初中就开始抱怨&#xff1a;我学相似三角形能干什么&#xff1f;阿伏伽德罗常数有什么用&#xff1f;我一不跳楼&#xff0c;二不高空抛物&#xff0c;学自由…

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

&#xff08;一&#xff09; 真实面试题之&#xff1a;Hashmap的结构&#xff0c;1.7和1.8有哪些区别 不同点&#xff1a; &#xff08;1&#xff09;JDK1.7用的是头插法&#xff0c;而JDK1.8及之后使用的都是尾插法&#xff0c;那么他们为什么要这样做呢&#xff1f;因为JDK1…