• 洛谷P1019: 单词接龙(dfs)


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

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1: 复制

    5
    at
    touch
    cheat
    choose
    tact
    a
    

    输出样例#1: 复制

    23
    

    解题思路:

    a[i][j]代表把第j个字符串连接到第i个字符串后中间重复的字符数目,深搜即可。

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define N 40
    char str[N][N], l[N], book[N];
    int a[N][N], inf=99999999, n, ans;
    void cut()
    {
    	int i, j, len, flag;
    	for(i=0; i<n; i++)
    	{
    		for(j=0; j<n; j++)
    		{
    			flag=0;		
    			int len1=strlen(str[i]);
    			int len2=strlen(str[j]);
    			for(len=1; len<len1&&len<len2; len++)
    			{
    				if(strncmp(str[i]+len1-len, str[j], len)==0)
    				{
    					flag=1;
    					break;
    				}
    			}
    			if(flag==1)
    				a[i][j]=len;
    			else
    				a[i][j]=inf;
    		}
    	}
    }
    void dfs(int s, int i)
    {
    	ans=max(ans, s);
    	int j;
    	for(j=0; j<n; j++)
    	{
    		if(a[i][j]!=inf && book[j]<2)
    		{
    			book[j]++;
    			dfs(s+strlen(str[j])-a[i][j], j);
    			book[j]--;
    		}
    	}
    }
    int main()
    {
    	int i, j, len;
    	scanf("%d", &n);
    	for(i=0; i<n; i++)
    		scanf("%s", str[i]);
    	scanf("%s", l);
    	cut();
    	ans=0;
    	for(i=0; i<n; i++)
    	{
    		if(strncmp(l, str[i], strlen(l))==0)
    		{	
    			if(strlen(str[i])-strlen(l)>0)
    			{
    				memset(book, 0, sizeof(book));
    				book[i]++;
    				dfs(strlen(str[i]), i);
    			}		
    		}
    	}
    	printf("%d
    ", ans);
    	return 0;	
    }
  • 相关阅读:
    var、let、const之间的区别
    es5和es6的区别
    [2020CCPC威海G] Caesar Cipher
    [CF1437E] Make It Increasing
    [CF1437C] Chef Monocarp
    [CF1436D] Bandit in a City
    [CF1418D] Trash Problem
    [CF1419E] Decryption
    [CF1420C2] Pokémon Army (hard version)
    [CF1424M] Ancient Language
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852684.html
Copyright © 2020-2023  润新知