SDNU 1022.成語接龍(DFS)

SDNU 1022.成語接龍

Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 71 Accepted Submission(s): 35

Description
成語接龍的的遊戲大家都玩過,現在咱們換換玩法,玩個英文版的“成語接龍”,規則是已知n個單詞,給出龍頭字母,要求以這個字母開頭的最長的“龍”(每個單詞最多在“龍”中出現2次),在兩個單詞相連時,起重合的部分合爲一部分,例如best和stabber,接成一條龍則變爲bestabber,另外相鄰的兩部分不能存在包含關係,例如at 和 atside 間不能相連。

Input
輸入的第一行爲一個整數n (n<=20),表示單詞個數,以下n 行每行有一個單詞(長度不超過50),輸入的最後一行爲一個單個字符,表示“龍”開頭的字母。此字母開頭的“龍”一定存在.

Output
只需輸出以此字母開頭的最長的“龍”的長度

Sample Input
5
at
touch
cheat
choose
tact
a

Sample Output
23

典型的dfs題,還有對於字符串的處理,在碰到前綴後綴判斷的時候,substr函數真的很好用,誰用誰知道。
值得注意的是對於前後綴的判斷要從大向小判斷。

仔細做還是很簡單的,附上Ac代碼:

#include<bits/stdc++.h>
using namespace std;

int maxn=0,n;
string a[30];
int pd[30]= {0};

void dfs(string b,int sum)
{
    maxn=max(maxn,sum);
    //cout<<sum<<' '<<b<<endl;
    for(int i=0; i<n; i++)
    {
        if(pd[i]<2)
        {
            int lena=a[i].length();
            int lenb=b.length();
            int minx=min(lena,lenb);
            for(int j=minx-1; j>=1; j--)
            {
                if(b.substr(lenb-j,lenb)==a[i].substr(0,j))
                {
                    int x=b.substr(lenb-j,lenb-1).length();
                    pd[i]++;
                    dfs(a[i],sum+lena-x);
                    pd[i]--;
                }
            }
        }

    }
}
int main()
{
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];
    char s;
    cin>>s;
    for(int i=0; i<n; i++)
    {
        if(a[i][0]==s)
        {
            memset(pd,0,sizeof(pd));
            pd[i]++;
            dfs(a[i],a[i].length());
        }
    }
    cout<<maxn<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章