【问题描述】
给出一个长度不超过 200 的由小写英文字母组成的字母串 ( 约定:该字母串以每行 20 个字母的方式输
入,且保证每行一定为 20 个 ) 。要求将此字母串分成 k 份 (1<k<=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
【输出样例】
给出一个长度不超过 200 的由小写英文字母组成的字母串 ( 约定:该字母串以每行 20 个字母的方式输
入,且保证每行一定为 20 个 ) 。要求将此字母串分成 k 份 (1<k<=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
思路:
比较明显的动态规划问题,我们这样定义子结构,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]