re了,蒟蒻求助
查看原帖
re了,蒟蒻求助
616347
Samsgc楼主2024/11/5 20:11
//搜索,以及用了一下字符串 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
string s[25];
int n,tot;
int a[25][25];
bool b[25][25];
int num[25],maxm=0;
int find(int x,int y)
{
	//搜索
	for(int i=1;i<=n;i++)
	{
	    if(b[x][i]==1&&num[i]<2)//两单词能连在一起并且此单词使用次数小于2次
		{
		    y+=a[x][i];
			num[i]++;
			find(i,y);
			num[i]--;//回溯
			maxm=max(maxm,y);//查找最大值
			y-=a[x][i];//回溯	
		}	
	} 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n+1;i++)cin>>s[i];
	for(int i=1;i<=n;i++)
	{
		if(s[n+1].substr(0,1)==s[i].substr(0,1))
		    //string类型可以通过“==”判断是否相等
		{
		    b[n+1][i]=1;a[n+1][i]=s[i].length()-1;
	    }  
    }
	//查找首单词
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=s[i].length()-1;k>=1;k--)//倒序,这样找的最小重叠而不是最大重叠
			{
				if(s[j].substr(0,k)==s[i].substr(s[i].length()-k,k))
				{
					//判断两个单词是否有重叠
					a[i][j]=s[j].length()-k;
					b[i][j]=1;//在两个能连一起的单词加上边	
				}	
			}	
		}	
	} 
	find(n+1,0);//搜索从首字母开始
	cout<<maxm+1;//把首字母的长度加上 
	return 0;
}
2024/11/5 20:11
加载中...