DFS  龙

Posted on 2017-10-29 17:11  Murs  阅读(126)  评论(0)    收藏  举报

洛谷P1019

 

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<stack>

#include<cstring>//

using namespace std;

int n,num;

string w[25];//记录单词

int use[25];//记录使用单词次数

int ans,now=1;//记录接龙的长度,now=1是省略了头字母

void dfs(int k)//深搜

{

    ans=max(ans,now);//跟上个题解学的,取大

    for(int i=1;i<=n;i++)//搜索每个单词

    {

        if(use[i]<2)//判断

        {

            for(int j=0;j<w[k].length();j++)//判断,如果首字母相同则比较

                if(w[i][0]==w[k][j])

            {

                int l1=j,l2=0;

                while(w[i][l2]==w[k][l1]&&l1<w[k].length())l1++,l2++;//比较至词尾

                if(l1>=w[k].length())//如果比较完成

                {

                    now+=w[i].length()-l2;//新单词减去与上个单词重合的长度

                    use[i]++;

                    dfs(i);//以这个单词为新节点搜索

                    now-=w[i].length()-l2;

                    use[i]--;

                }

            }

        }

    }

}

int main()

{

    cin>>n;

    for(int i=1;i<=n;i++)

        cin>>w[i];

    cin>>w[0];//**把头字母看做一个单词**

    dfs(0);//**从头字母这个单词搜索**

    cout<<ans;

    return 0;

}