洛谷P1019单词接龙(dfs)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;

int n;
int ans = 0;
string s[22];
int u[22];
int check(string s1,string s2){
	int t1 = s1.length();
	int t2 = s2.length();
	int t3 = min(t1,t2);
	for (int i = 1;i <=t3;i++)
	  { int p = 1;  
	  for (int j = 0;j < i;j++) //s1 从length-i开始,到n,s2从0开始,到i 
	    {
	      	if (s1[t1-i+j]!=s2[j])
			   {
			   	p = 0;
			   } 
	}
        if (p == 1) return i;

}
return 0;
}
void dfs(int length,string s1){

	 if (length > ans ) ans = length;
    for (int i = 1 ;i <= n;i++)
      if (check(s1,s[i]) && u[i]<2) {
		string s2;
      	s2 = s1;
      	int t = s[i].length();
      /*	for (int j = check(s1,s[i]);j <t;j++)
      	   {
      	   s2 +=s[i][j];
		}*/
		   u[i]++;
      	dfs(length+t-check(s1,s[i]),s[i]);
           u[i]--;
	  }
}
int main(){
    cin >>n;
	for (int i = 1;i <= n;i ++)
	   cin>>s[i];
	cin>>s[n+1];
	dfs(s[n+1].length(),s[n+1]);	
	cout<<ans;
    return 0;
}

开始犯了两个错误:1.取的不是最小重叠而是最大重叠,在check中i从t3往1循环,这样会导致如果s1 是abcdaskask,s2是askaskabcd的话,重叠部分算的是askask,重叠数为6,而题目要求只需要ask就可以,为3
这样就会浪费很多位.只能过最后三个点.
第二个错误,check处最后忘记return 0,导致如果两个字符串没有重叠,则一直没有返回值,所以最后三个点一直在tle,hhh两个错误一个过了前三个点,一个过了后三个点,但没数据啊,还是没用

下面讲思路
两个函数,dfs和check,dfs用来跑搜索,check用来检查,检查的时候按照长度小的来…
dfs看了大佬的代码,我每次都会在更新字符串长度的时候把字符串也更新,最后估计会变成一个究极长的字符串,但其实只需要把新字符串变成a[i]就可以(不知道是不是bug,我觉的我的更保险,而且时间复杂度不会高很多).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值