洛谷p1019单词接龙

题目描述

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

网址:https://www.luogu.org/problemnew/show/P1019

这题是一个有点坑的题:

首先在题意上可能有些误解。

  • 两个单词合并时,合并部分取的是最小重叠部分

  • 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。

  • 每个单词最多出现两次.  (此话转载于Hinanawi_Feng)

#include 
#include 
#include 
using namespace std;
char a[21][1000];
int book[21];
int n,ans=1,sum;
void dfs(int s)
{
	if(ans>sum)
	{
		sum=ans; //更新最大值
	}
    for(int i=1;i<=n;i++)
    {
        if(book[i]<2)
        {
			int len1=strlen(a[s]);
            for(int j=0;j					
                    int x,y;
                    x=j;
					y=0;
					while(a[i][y]==a[s][x] && x					{
						x++;
						y++;
					}
					if(x>=len1)
					{
						int len2=strlen(a[i]);
						ans=ans+len2-y;
						book[i]++;
						dfs(i);
						book[i]--;
						ans=ans-len2+y;
					}
                }
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
		scanf("%s",a[i]);
    }
    scanf("%s",a[0]);
    dfs(0);
    printf("%d",sum);
    return 0;
}

你可能感兴趣的:(洛谷p1019单词接龙)