P1019 [NOIP2000 提高组] 单词接龙 深度优先搜索

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码实现
  • 总结


题目链接

链接: P1019 [NOIP2000 提高组] 单词接龙

题目描述

在这里插入图片描述

解题思路

这是一道深度优先搜索题目,我们定义check函数来计算两个字符串的最小重合部分,dfs中第一个参数代表我们当前使用的是哪一个字串,不需要是拼接后的字符串,因为他没让我们输出最后的字符串,只是要最后字符串的长度,第二个参数则是当前拼接字符串的长度
下面来看dfs代码

这段代码是更新答案

ans=max(ans,l);

下面这段代码是dfs的主体,因为每个子串只能使用2次,所以我们定义一个fre即使用频率数组,如果使用次数已经大于等于两次,则不考虑这个子串,continue,之后要注意先检查重合部分是否大于0,之后别忘记回溯

for(int i=0;i<n;i++){if(fre[i]>=2) continue;if(check(now,s[i])){fre[i]++;dfs(s[i],l+s[i].length()-check(now,s[i]));fre[i]--;}}

最后一个需要注意的点是因为字符串之间不能存在包含关系,如果只传递s[n],则不会拼接,最后的结果就是原本的子串长度,为1
所以要在前面加一个空白字符

	dfs(' '+s[n],1);

代码实现

#include<bits/stdc++.h>
using namespace std;
string s[20];
int fre[20],n,ans=0;
int check(string a,string b)
{for(int i=1;i<min(a.length(),b.length());i++){bool flag=true;for(int j=0;j<i;j++){if(a[a.length()-i+j]!=b[j]){flag=false;break;}}if(flag) return i;}return 0;
}
void dfs(string now,int l)
{ans=max(ans,l);for(int i=0;i<n;i++){if(fre[i]>=2) continue;if(check(now,s[i])){fre[i]++;dfs(s[i],l+s[i].length()-check(now,s[i]));fre[i]--;}}
}
int main()
{cin>>n;for(int i=0;i<=n;i++) cin>>s[i];dfs(' '+s[n],1);cout<<ans;return 0;
}

总结

这是一道经典的深度优先搜索(DFS)题目,要求找出单词接龙的最长长度。首先通过check函数计算两个字符串的最小重合部分,然后通过DFS算法来实现遍历所有可能的接龙方式,并更新最长长度。代码实现中使用了适当的剪枝来减少搜索空间和优化算法效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/440248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】WSL(Windows Subsystem for Linux)常见命令解释说明以及简单使用

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Android Studio 出现 “Index is not created for `Stubs‘“ 的原因,如何解决?

亲爱的朋友们&#xff01;大家好我是咕噜铁蛋&#xff01;&#xff0c;今天我将与大家分享一个在Android Studio开发过程中可能遇到的问题&#xff1a;“Index is not created for Stubs”。这个问题看似不起眼&#xff0c;但实际上可能会对开发效率产生不小的影响。下面&#…

申万宏源:证券低时延交易系统全链路自主可控创新实践 |论坛实录

由中科驭数主办的第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛&#xff08;上海站&#xff09;在上海举行。会上各位嘉宾深入的分享&#xff0c;吸引了不少行业同仁对本次会议干货内容的关注。特此&#xff0c;中科驭数整理部分演讲者发言实录&#xff0c;…

Django学习之orm框架

八、Django学习之orm框架 其他关于Python Web开发笔记&#xff1a;&#xff08;如果遇到问题可以一起交流~&#xff09; 一、Flask学习之HTML-CSDN博客 二、Flask学习之CSS-CSDN博客 【接上篇】二、Flask学习之CSS&#xff08;下篇&#xff09;-CSDN博客 三、Flask学习之Bo…

BUUCTFSQL注入(部分)

原来靶场不是最折磨的&#xff0c;新手做ctf才是 1.[极客大挑战 2019]LoveSQL 我一共做了三题&#xff0c;先来讲里面最简单的题吧 看见一个登录框&#xff0c;先尝试注入&#xff0c;发现会报错&#xff0c;而且不过滤# &#xff0c;于是就开始常规操作 1 union select 1,d…

3985. 辗转相除法

一、题目 Problem #3985 - ECNU Online Judge 二、思路 第一眼还以为是最基本的欧几里得&#xff0c;然后一个劲地在那里找合适的一组整数&#xff0c;找了一会没找到&#xff0c;后面直接用随机查找一下子找到了 三、代码 import sun.misc.GC;import java.util.Random; impo…

类和对象 第五部分第六小节:函数调用运算符重载

1、函数调用运算符&#xff08;&#xff09;可以重载 由于重载后使用方式非常像函数的调用&#xff0c;因此称此为仿函数 代码案例&#xff1a;打印输出仿函数 #include<iostream> using namespace std; class MyPrint { public://重载函数调用运算符void operator()(str…

2分钟快速了解!全网最详细的性能测试教程之【Redis 简介和安装】

本篇文章主要介绍基于Redis的的简介和安装&#xff0c;其中参考了许多大佬写的文章&#xff0c;算是做一个Redis的基础教程吧。 Redis 简介 Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有…

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

2024情人节爱心表白--python代码

# coding=utf-8 import random import turtle from datetime import *# 抬起画笔,向前运动一段距离放下 def Skip(step):turtle.penup()turtle.forward(step)turtle

学会用Python分割、合并字符串

在很多情况下&#xff0c;我们需要对字符串进行分割或合并&#xff0c;以满足特定的需求&#xff0c;例如将字符串拆分成多个部分、将多个字符串合并成一个等等。Python提供了多种方法来进行字符串的分割和合并&#xff0c;本文将介绍其中几种常用的方法。 一、使用split()函数…

git仓库批量备份

git的mirror参数 在git中&#xff0c;--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库&#xff0c;包含了源仓库的所有分支、标签和提交历史记录。 当使用git clone --mirror <source-repo>命令时&#xff0c;会创建一个完全相同的镜像仓库&#xff0…