- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划入门25
动态规划入门25 动态规划入门25 分类:算法与数据结构 例题24 统计单词个数 (.pas/c/cpp) 来源:NOIP2001(提高组) 【问题描述】 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1k=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。 单词在给出的一个不超过6个单词的字典中。 要求输出最大的个数。 【输入文件】 去部输入数据放在文本文件input3.dat中,其格式如下: 每组的第一行有二个正整数(p,k) p表示字串的行数; k表示分为k个部分。 接下来的p行,每行均有20个字符。 再接下来有一个正整数s,表示字典中单词个数。(1=s=6) 接下来的s行,每行均有一个单词。 【输出文件】 结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。 【输入样例】 1 3 thisisabookyouareaoh 4 is a ok sab 【输出样例】 7 【问题分析】 刚看到这个题目觉得很迷茫,没入手点但是突然看到了闪亮的突破口:题目中说this包含this和is 但不包含th这也就是说在一个串内对于一个固定了起点的单词只能用一次,即使他还可以构成别的单词但他还是用一次。比如:串:thisa 字典:this is th 串中有this is th这三个单词,但是对于this 和 th 只用一次,也就是说枚举一下构成单词的起点,只要以该起点的串中包含可以构成一个以该起点开头的单词,那么就说明这个串中多包含一个单词。 这样可一得出下面的结果: 每举的起点 结论: t 至少包含1个 h 至少包含1个 i 至少包含2个 s 至少包含2个 a 至少包含2个 考虑到这里,就有点眉目了。 题目中要将串分K个部分也就是说从一个点截断后一个单词就未必可以构成了。比如上例要分3个部分合理的其中的一个部分至多有3个字母,这样this 这个单词就构不成了。 要是分5个部分,那就连一个单词都够不成了。 这样就需要对上面做个改动,上面的只控制了起点,而在题目中还需要限制终点,分完几个部分后,每部分终点不同可以构成的单词就不同了。 这样就需要再枚举终点了。 设计一个二维数组sum[i,j]统计从i到j的串中包含的单词的个数 状态转移方程: sum[i+1,j]+1 (s[i,j]中包含以S[i]开头的单词) sum[i,j]= sum[i+1,j] (与上面相反) 注:(1)这里枚举字符的起点的顺序是从尾到头的。 (2)有人把上面这次也看做是一次动态规划,但我觉得更准确的说是递推。 求出所有的SUM还差一步,就是不同的划分方法显然结果是不一样的,但是对于求解的问题我们可以这样把原问题分解成子问题:求把一个串分成K部分的最多单词个数可以看做是先把串的最后一部分分出来,在把前面一部分分解成K-1个部分,显然决策就是找到一种划分的方法是前面的K-1部分的单词+最后一部分的单词最多。 显然这个问题满足最优化原理,那满足不满足无后效性呢? 对于一个串分解出最后一部分在分解前面的那部分是更本就不会涉及分好的这部分,换句话说没次分解都回把串分解的更小,对于分解这个更小的传不会用到不属于这个小串的元素。这就满足无后效性。 具体求解过程: 设计一个状态opt[i,j]表示把从1到j的串分成i份可以得到最多的单词的个数。决策就是枚举分割点使当前这种分割方法可以获得最多的单词。 状态转移方程:opt[I,j]=max(opt[i-1,t]+sum[t+1,j]) (itj) 边界条件:opt[1,i]=sum[1,i] (0i=L) 时间复杂度:状态数O(N2)*决策数O(N)=
文档评论(0)