洛谷 P1019 单词接龙 dfs的题,这个题不好想的就是这个重复单词的选取过程,我索性看了题解。发现可以直接用两个for得出,i确定第一个串的左边的位数j确定右移多少位。注意i从1开始因为str[i][str[i].size()]没有值!!! 题目还有要求就是每个字符串最多用两次,那么就跟每个字符串只能访问一次一样的回溯只是use[i]=0变成了use[i]--罢了。 我的代码(题解的算法)

int bj(string a,string b)
{
	for(int i=1;i<=min(a.size(),b.size());i++)
	{
		int f=1;
		for(int j=0;j<i;j++)
		if(a[a.size()-i+j]!=b[j])
		f=0;
		if(f) return i;
	}
	return 0;
}

题目还有要求就是每个字符串最多用两次,那么就跟每个字符串只能访问一次一样的回溯只是use[i]=0变成了use[i]--罢了。

我的代码(题解的算法)

#include <bits/stdc++.h>
using namespace std;
string st[100];
int use[100];
int len;
int n;
int bj(string a,string b)
{
	for(int i=1;i<=min(a.size(),b.size());i++)
	{
		int f=1;
		for(int j=0;j<i;j++)
		if(a[a.size()-i+j]!=b[j])
		f=0;
		if(f) return i;
	}
	return 0;
}
void dfs(string a,int b)
{
	len=max(b,len);
	for(int i=0;i<n;i++)
	{
		if(use[i]>=2)
		continue;
		int c=bj(a,st[i]);
		if(c)
		{
			use[i]++;
			dfs(st[i],b+st[i].size()-c);
			use[i]--;
		}
	}
}
main()
{
	cin>>n;
	for(int i=0;i<=n;i++)
	cin>>st[i];
	dfs(st[n],1);
	cout<<len;		
}