vj p1028题解

题目描述

此题被分类为字符串处理,实际上可以说是DP

以为所有字符都已排序,那么只有可能前面的字符串作为后面的前缀。而且每次选前缀时,当然要选包含前缀最多的字符串。

话已至此,读者是否想到了某个经典的DP呢?当然就是最长不下降(上升)序列啦!

f[i]表示第i个字符串最大包含前缀

f[i]:=max(f[j]+1);(if pos(s[j],s[i])=1)

代码如下:

 1 var n,j,i,max:longint;a:array[0..2000]of string;
 2     f:array[0..2000]of longint;
 3 begin
 4   readln(n);
 5   fillchar(f,sizeof(f),0);
 6   max:=0;
 7   for i:=1 to n do
 8     begin
 9       readln(a[i]);
10       j:=i-1;
11       while (j>0)and(pos(a[j],a[i])<>1do dec(j);
12       if j>0 then f[i]:=f[j]+1;
13       if f[i]>max then max:=f[i];
14     end;
15   writeln(max+1);
16 end.
原文地址:https://www.cnblogs.com/waterfalleagle/p/1599403.html