dfs-字符串习题(P1019 单词接龙)

这篇文章介绍了解决NOIP2000提高组中的一个单词接龙问题的C++代码,使用深度优先搜索策略,找出最长的可以连接的单词序列。

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1019

一道远古的NOIP,数据较水,直接上代码

// Problem: 
//     P1019 [NOIP2000 提高组] 单词接龙
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1019
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
using namespace std;
const int N=22;
int ans=0;
int n;
string a[N];//n个字符串
int used[N];//记录使用过几次(有规定最多用两次)
void dfs(string s){
	int ls=s.size();//记录长度
	ans=max(ans,ls);//更新最大值
	for(int i=1;i<=n;++i){
        int lw=a[i].size();//记录长度
        for(int j=1;j<ls&&j<lw;++j){//控制j的大小,让某一个字符串不能被完全重合
        	if(s.substr(ls-j)==a[i].substr(0,j)&&used[i]<2){//保证两次一下,且有重合部分
        		used[i]++;
        		dfs(s+a[i].substr(j));//substr只有一个参数时,从索引位置开始
        		used[i]--;
        		break;//直接跳出,因为最短重合,最后就越长
        	}
        }
	}
}




int main(){
	cin>>n;
	for(int i=1;i<=n;++i) cin>>a[i];
	string start;cin>>start;start=' '+start;
    //前面加一个,因为单词一定长度一定大于1,防止dfs判断中被卡出去
	dfs(start);
	cout<<ans-1<<endl;//记着要把最前面那个空格减掉
	
	
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值