解题思路:
注意事项:
参考代码:
首先在题意上可能有些误解。
两个单词合并时,合并部分取的是最小重叠部分
相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。
每个单词最多出现两次.
(其实也就是读题问题。这些都是我所犯的错误,希望大家能注意一下)
好了。然后是解题思路。
首先是预处理,用yc[i][j]来存储 第i个单词 后连接 第j个单词 的 最小重叠部分(mt函数)
后来预处理完了之后就是深搜:
先从第一个到最后一个单词看一看哪个单词是指定字母为开头的,作为深搜的第一个单词,同时标记使用过一次(vis[i]++)
然后继续搜吧。
以下是代码。 mt函数可能有点难理解。拿草纸模拟一下就能很直观知道在干什么了。#include
#include
#include
#include
using namespace std;int n;//单词数
string tr[30];//存储字符串
int yc[30][30];//两个字母的最小重叠部分
int vis[30];//判断单词使用频率.
int mt(int x, int y){//mt函数,返回x单词后连接一个y单词的最小重叠部分
bool pp=true;
int ky=0;
for(int k=tr[x].size()-1;k>=0;k--){//从x单词尾部向前看看最小重叠部分是从哪里开始的,以为因为是倒着来,所以保证是最小的
for(int kx=k;kx
if(tr