- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
回文词
问题描述 略
算法A
简单地说,问题等价于:将原串St从某处截断,成为St[1..j]和ST[j+1..n],求St[1..j]和St[j+1..n]的倒序串的最长公共子序列的长度。(不失一般性,设j≥n-j)
比如样例:Ab3bd,有“Ab3”和“bd”的倒序“db”,其公共子序列最长为1——“b”。也就是说,该段公共序列是不需要经过处理就满足回文要求的,而其余的字符则需要进行复制。所以添加的字符数应为n-2*Length(SubString)。而注意到,有时某个字符可作为对称中心出现,不须被复制(例如上例中的“3”),所以若前一个子串的最后一个字符未出现在求得的公共子串中,则将它作为对称中心,最少要添加n-2*Length(SubString)-1个字符。
求解的方程可表示为:
Min{ n-2*Max{LongestSub(St[1..j], St[n..j+1])} ( n div 2 ≤j<n ) ,
n-2*Max{LongestSub(St[1..j], St[n..j+2])}-1 ( n div 2 <j<n ) }
其中LongestSub(St1,St2)表示St1和St2的最长公共子序列的长度,
St[i..j] 表示原串中从第i位到第j位依次构成的一个新字符串。
对于最长公共子序列的求解分析
设,现在要求字符串St1和St2的最长公共子序列,其长度分别为L1,L2。 动态规划求解的过程是众所周知的: 令L[i,j]表示St1的前i位与St2的前j位的最长公共序列长度, 则:
L[i,j]=
Max{ L[i-1,j-1]+1, L[i,j-1], L[i-1,j]} 若St1[i]=St2[j];
Max{ L[i,j-1], L[i-1,j]} 若St1[i]≠St2[j].
( 1≤i≤L1 , 1≤j≤L2 , 显然i或j为0时,L值为0).
于是,LongestSub=L[L1,L2]。
基于在本题的这种算法思想中,似乎对于最长公共子序列的求解要被多次应用,然而其中重复计算颇多,可直接求原串St及其倒序串St的最长公共序列,在该过程中完成上述的若干过程。
for i:=1 to n do
for j:=1 to smaller(n-i,n div 2) do
{以St的前i位匹配St的前j位,避免重复计算,同时要满足: i+j=n, j=n div 2 }
begin
推出L[i,j].
if i+j=n-1 {如果i+j=n 或i+j=n-1,说明找到可行解}
then
若n-L[i,j]*2-(n-i-j)优于当前最优,更新之
end;
节约起见,根据递推的特点,可用一维数组替代二维进行迭代。
算法B
使用类似数字三角形或最小代价子母树的动态规划过程。
令Cost[i,j]表示将原串St从第j位开始长度为i的子串SubString变成回文词的最小添加字符数。
按SubString的长度大小依次进行递推求解:
Cost[i,j]=
Cost[i-2,j+1] 若St[j]=St[i+j-1],即首尾对称,
Min{ Cost[i-1,j]+1, Cost[i-1,j+1]+1 } 若St[j]St[i+j-1]。
2≤i≤n , 1≤j≤n-i+1
显然,当 i=1或0 时,Cost值均为0。
数据结构
本题的数据结构相对简单,主要包括用作状态变量的数组。
时空评估
空间方面,根据算法的不同,大约需要10到30K左右的空间。
我编程实现的上述两种算法对于IOI标准测试数据的耗时情况如下:
注:下表使用IOI2000标准测试数据,运行环境P366MHz 32MB(单位:s)
测试数据 1 2 3 4 5 6 7 8 9 10 A用时 0.00 0.71 0.71 0.71 0.77 0.00 0.00 1.04 0.82 0.77 B用时 0.00 2.30 0.00 1.87 1.87 0.00 0.00 2.31 2.42 1.60
小结
作为IOI的第一题,这是一道典型的动态规划题。具体运用动态规划方法时,所要注意的地方在于:1)首先,分析题意,考察此题是否满足最优化原理与无后效性两个条件。2)接着,确定题中的阶段,状态,及约束条件。3)推导出各阶段状态间的函数基本方程,进行计算。
文档评论(0)