动态规划训练6 [统计单词个数]

来源:互联网 发布:淘宝皇冠店铺大全 编辑:程序博客网 时间:2024/06/06 05:10
【问题描述】
给出一个长度不超过
200 的由小写英文字母组成的字母串(约定:该字母串以每行20 个字母的方式输
入,且保证每行一定为
20 )。要求将此字母串分成k (1<k<=40),且每份中包含的单词个数加起来总数
最大
(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this
中可包含 this is,选用this 之后就不能包含 th)
单词在给出的一个不超过
6 个单词的字典中。要求输出最大的个数。
【输入文件】
输入数据放在文本文件
input3.dat 中,其格式如下:
每组的第一行有二个正整数
(pk)p表示字串的行数; k 表示分为 k 个部分。
接下来的
p 行,每行均有 20 个字符。
再接下来有一个正整数
s,表示字典中单词个数。(1<=s<=6)
接下来的 s 行,每行均有一个单词。
【输出文件】
结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。
【输入样例】
1 3
thisisabookyouareaoh
4
is
a
ok
sab
【输出样例】

7

思路:

比较明显的动态规划问题,我们这样定义子结构,opt[i][j]表示把S[1...i]序列划分成j分,每份中所包含的单词数之和的最大值。那么状态转移方程就是:

opt[i][j] = max{opt[k][j-1] + sum[k+1][i]}

其中sum[i][j]表示序列[i...j]中所包含的单词的数量,这个数组可以用下面的方法来求。

sum[i][j] = sum[i+1][j] + 1,其中S[i...j]中包含以S[i]开头的单词

如果不包含的话直接有sum[i][j] = sum[i+1][j]



原创粉丝点击