luogu 1019 单词接龙 dfs细节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu 1019 单词接龙 dfs细节相关的知识,希望对你有一定的参考价值。

P1019 单词接龙

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

输入输出格式

输入格式:

输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出格式:

只需输出以此字母开头的最长的“龙”的长度

输入输出样例

输入样例#1:
5
at
touch
cheat
choose
tact
a
输出样例#1:
23           (连成的“龙”为atoucheatactactouchoose)   

说明

NOIp2000提高组第三题

 

Solution

比较水的一题,交了四五次才过,似乎药丸。。

首先compare一下计算出i 接 j 会延长多长记录在f[i,j]然后dfs瞎搞一下

题目比较迷,觉得自己的读题姿势有待提高

首先我们要弄清楚接龙到底是什么?
接龙?不就是普通的接龙吗?
不对,同个多次WA可以得知原来同样的两个串接龙可以有多种接法
比如ababab和ababcc,你可以接龙为abababcc或者ababababcc,所以我们可以在后面加一个优化

还有就是题目所说的包含关系,不包括自己接自己啊,
所以自己接自己,如果除了完全覆盖还有其他情况也可以

于是代码——

Codes

 1 program no;
 2 uses math;
 3 const
 4   inf=test.in;
 5   outf=test.out;
 6 var
 7    a:array[1..20] of string;
 8    i,j,n,tot,ans:longint;
 9    f:array[1..20,1..20] of longint;
10    ex:array[1..20] of longint;
11    tt:char;  
12    
13 procedure compare(aa,bb:longint);
14 var
15   i,j,lena,lenb,k:longint;
16 begin
17   lenb:=length(a[bb]);
18   lena:=length(a[aa]);
19   k:=maxlongint;
20   for j:= lena downto 1 do
21     if a[aa,j]=a[bb,1] then
22      if copy(a[aa],j,lena-j+1)=copy(a[bb],1,lena-j+1) then
23        if (lena-j+1=min(lena,lenb)) then  //如果有包含关系
24             begin  if aa<>bb then exit; end //排除自己接自己
25        else begin
26               k:=min(k,lena-j+1);
27               break;//优化
28             end;
29 
30   if k<>maxlongint then
31     f[aa,bb]:=lenb-k;//记录延长的长度
32 end;
33 
34 procedure search(i:Longint);  //dfs
35 var
36   j:longint;
37 begin
38     for j:= 1 to n do
39       if ex[j]>-2 then  //如果还有可以用的次数
40         if f[i,j]<>0 then  //如果不是白接
41         begin
42           // writeln(i, ,j, ,f[i,j]);
43             tot:=tot+f[i,j];
44             dec(ex[j]);
45             search(j);
46             tot:=tot-f[i,j];
47             inc(ex[j]);
48         end;
49     if ans<tot then ans:=tot;
50 end;
51 
52 begin
53     //assign(input,inf);  assign(output,outf);
54     reset(input); rewrite(output);
55 
56     readln(n);
57     for i:= 1 to n do
58       readln(a[i]);
59     for i:= 1 to n do
60       for j:= 1 to n do
61         compare(i,j);
62     readln(tt);
63     for i:= 1 to n do    //枚举开头的串
64       if tt=a[i,1] then
65       begin
66         fillchar(ex,sizeof(ex),0);
67         tot:=length(a[i]);
68         dec(ex[i]);
69         search(i);
70       end;
71     writeln(ans);
72     close(input);  close(output);
73 end.

 

以上是关于luogu 1019 单词接龙 dfs细节的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1019 单词接龙

Luogu 1019 单词接龙

搜索单词接龙 luogu-1019

Luogu_1019单词接龙

洛谷 P1019 单词接龙 Label:dfs

dfs(洛谷1019 单词接龙NOIp2000提高组第三题)