zoukankan      html  css  js  c++  java
  • (洛谷)P1019 单词接龙

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

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

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

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

    NOIp2000提高组第三题

    DFS
    注意细节,这个代码自己仍需深思。

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=50;
    string str[MAXN];
    int n,used[MAXN];
    int ans=0;
    int check(string a,string b)//查找想同的部分长度
    {
        int la=a.size(),lb=b.size();
        int l=min(la,lb);
        for(int i=1;i<l;i++) {
            int flag = 1;
            for (int j = 0; j < i; j++){
                if(a[la-i+j]!=b[j])
                    flag=0;
            }
            if(flag) return i;
        }
        return 0;
    }
    void dfs(string s,int len)
    {
        ans=max(ans,len);
        for(int i=0;i<n;i++){
            if(used[i]>=2) continue;
            int c=check(s,str[i]);
            if(c>0) {
                used[i]++;
                dfs(str[i],len+str[i].size()-c);
                used[i]--;
            }
        }
    
    }
    int main()
    {
        cin>>n;
        getchar();
        for(int i=0;i<n;i++) {
            cin>>str[i];
            getchar();
            used[i]=0;
        }
        string s;
        cin>>s;
        dfs(' '+s,1);
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    WinForm 资源文件的使用
    php 常量
    netbean使用技巧
    netbeans 7安装xdebug调试php程序
    eclipse 开发技巧
    asp.net 获取客户机IP地址
    NameValueCollection详解
    Paramics插件编程进程间通讯
    Paramics API编程配置
    windows查询端口占用
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220236.html
Copyright © 2011-2022 走看看