• 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.
  • 相关阅读:
    java 多线程学习(一)
    解决安卓微信浏览器刷新问题
    sublime text3 配置tab为4个空格
    React 错误Each child in an array or iterator should have a unique “key” prop
    git filename to long问题解决
    JS获取URL参数 方法
    CSS超出2行省略号
    JS判断是否为安卓orIOS
    获取移动设备真实宽高
    微信分享朋友圈监听(PHP)
  • 原文地址:https://www.cnblogs.com/bobble/p/6818252.html
Copyright © 2020-2023  润新知