- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
走进“回文”的神秘世界中
在平时生活中,有一种现象经常会引起我们的注意和好奇,那就是“回文”。有一副据说是至今无解的对联“上海自来水来自海上”就是一个经典的回文的例子。同样的,在信息学竞赛中也有各种各样与回文有关的题目。下面我们一起来走进这个神秘的世界吧——
(热身题)回文质数(From USACO)
因为151即是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 号是回文质数。
写一个程序来找出范围[a,b](5 = a b = 100,000,000)间的所有回文质数。、
输入格式
第 1 行: 二个整数 a 和 b
样例输入
5 500
输出格式
输出一个回文质数的列表,一行一个。
样例输出
5
7
11
101
131
151
181
191
313
353
373
383
9999
从此题数据范围来看,若用朴素的循环数字表进行判断在时间限制内无法得解,那么就需要我们利用回文数的性质来进行优化,这里我们可以采用构造法进行解答。如果要构造出n位数中的所有回文数,我们可以通过回文数左右相同的性质只构造出n位数中的左半部分,右半部分镜象处理,当n是奇数时,将前1~[n/2] +1镜象后添加到右半部分,到n是偶数时将前1~[n/2]镜象后添加到右半部分,这样即可将复杂度降为sqrt(10^k) (当n为奇数时,k=n+1/2,当n为偶数时,k=n/2); 如此一来时间复杂度即可满足题目要求,再加以素数判断,问题得解。
(标准程序:hw_1.cpp)
热身完毕了吗?那么真正的挑战就开始了——
DP类型的回文类型题:
(例题1)调整队形
学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的。
例如:“红蓝绿蓝红”或“红蓝绿绿蓝红”都是符合的,而“红蓝绿红”或“蓝绿蓝红”就不符合要求。
合唱队人数自然很多,仅现有的同学就可能会有3000个。老师希望将合唱队调整得符合要求,但想要调整尽量少,减少麻烦。以下任一动作认为是一次调整:
1、在队伍左或右边加一个人(衣服颜色依要求而定);
2、在队伍中任两个人中间插入一个人(衣服颜色依要求而定);
3、剔掉一个人;
4、让一个人换衣服颜色;
老师想知道就目前的队形最少的调整次数是多少,请你编一个程序来回答他。
因为加入合唱队很热门,你可以认为人数是无限的,即随时想加一个人都能找到人。同时衣服颜色也是任意的。
输入格式
第一行是一个整数n(1=n=3000)。
第二行是n个整数,从左到右分别表示现有的每个队员衣服的颜色号,都是1到3000的整数。
输出格式
一个数,即对于输入队列,要调整得符合要求,最少的调整次数。
样例输入
5
1 2 2 4 3
样例输出
2
设 a[i]为第i个人衣服的颜色,F[i,j]为第i到第j个人需要的调整的最少次数,那么
F[i,j] = min{ 1.F[i + 1][j - 1] + 1 (且满足a[i] != a[j],意思是将i或j其一变色来达成匹配)
2.F[i + 1][j] + 1 (且满足a[i] != a[j], 意思将第i人删除或者为匹配第i个人多加一人到j后面)
3.F[i][j - 1] + 1 (且满足a[i] != a[j], 同上意思将第j人删除或为匹配第j人多加一人到i后面)
4.F[i + 1][j - 1] (且满足 a[i] = a[j], 意为第i人与第j人衣着相同不需调整)}
边界是F[i][i] = 0;
则F[1][n]即为最终答案。
(标准程序:hw_2.cpp)
(例题2)回文字
如果一个单词从前和从后读都是一样的,则称为回文字。如果一个单词不是回文字,则可以把它拆分成若干个回文字。编程求一个给定的字母序列,最要分割成几部分,使每一部分都回文字。输入格式:输入文件有且只有一行,包含一个字符串。字符串由小写英文字母组成(a-z),长度超过100。输出格式:输出文件只一行,为最少的回文字个数。 样例1 样例2 样例3 输入 anaban abaccbcb anavolimilana 输出 2 3 5 样例1说明:(不用输出)
#1 a_naban #2 aba_cc_bcb #3 ana_v_o_limil_ana 5
Ab3bd
样例输出
2
要想知道最少需要添加多少个字母,我们只需求得串中的最长的回文串长度L(这个回文串不一定是连续的),设串总长为S,那么即是说S串中除去了L这个回文串后其他所有的字母都需要添加一个字母与之匹配。那么现在问题变成求母串中的最长回文子串(非连续),由于回文串左右相同,我们只需将母串翻转与母串进行一次最长公共子串长度的计算,即可得解。
文档评论(0)