NOIP 2000 单词接龙

看到很久的一道题,敲起来略麻烦一直咕到现在。

解法很水深搜+回溯就行

每次枚举所有单词判断是否出现过两次以上,是否能接上,接上长度是多少,是否重叠就可以,当没有能接上的单词表示已搜完维护答案最大值即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[50][300];
int len[50],t[50],ans=0,n,maxn=-41324;
void dfs(int id)
{
    int flg=0;
    for(int i=1;i<=n;i++)
    {
        if(t[i]<2)
            for(int j=0;j<len[id];j++)
            {
                if(s[i][0]==s[id][j])
                {
                    if(j==0&&len[i]!=len[id]) continue;
                    int l=1;
                    bool pan=0;
                    for(int h=j+1;h<len[id];h++)
                        if(s[id][h]!=s[i][l++])
                        {
                            pan=1;
                            break;
                        }
                    if(pan==1) continue;
                    else
                    {
                        flg++;ans+=len[i]-l;t[i]++;
                        dfs(i);
                        flg--;ans-=len[i]-l;t[i]--;
                    }
                }
            }
    }
    if(flg==0)
    {
        maxn=max(maxn,ans);
        return;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",&s[i]);
        len[i]=strlen(s[i]);
    }
    scanf("%s",&s[n+1]);
    for(int i=1;i<=n;i++)
        if(s[i][0]==s[n+1][0])
        {
            ans=len[i];t[i]++;dfs(i);
            ans=0;t[i]--;
        }
    printf("%d",maxn);
    return 0;
}
原文地址:https://www.cnblogs.com/charlesss/p/10732823.html