SSL 2297——单词的划分_DP

Description

有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。

Input

第一行,一个字符串。(字符串的长度不超过100)
  第二行一个整数n,表示单词的个数。(n<=100)
  第3~n+2行,每行列出一个单词。

Output

一个整数,表示字符串可以被划分成的最少的单词数。

Sample Input

realityour
5
real
reality
it
your
our
Sample Output

2


纯DP题,比较
思路主要是枚举长度,再判断这个长度能不能划分更多的单词。


代码如下:

var
  s:string;
  a:array[1..100]of string;
  l,f:array[0..100]of longint;
  i,j,k,m,n:longint;
begin
  readln(s);
  readln(n);
  for i:=1 to n do
    begin
      readln(a[i]);
      l[i]:=length(a[i]);
    end;
  for i:=1 to length(s) do
    begin
      f[i]:=maxlongint;
      for j:=1 to n do
        if l[j]<=i then
          if (copy(s,i-l[j]+1,l[j])=a[j])and(f[i]>f[i-l[j]]+1) then f[i]:=f[i-l[j]]+1;
    end;
  writeln(f[length(s)]);
end.
posted @ 2017-03-23 15:36  BEYang_Z  阅读(321)  评论(0编辑  收藏  举报