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])<>1) do 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.
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])<>1) do 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.