DFS+字符串处理 洛谷P1019

题目:https://www.luogu.org/problemnew/show/P1019
题解
1.题目要求每个字符串最多使用两次,那么将输入的字符串复制一次即可,不必为此设置计数数组。
2.根据贪心原理,取得重复长度越短总的长度越大
3.注意重合长度比较的方法
4.在不同函数中可以直接传string类型的函数值
5.注意赋初值的问题
6.本题不要求输出拼接后的结果,只要求输出拼接后的长度,因此不必进行实际的拼接操作,只需要进行长度计算即可!!!!!!
方法一:不进行拼接操作

#include
using namespace std;
string str[50],begin;
int length=0,n;//重要初始化 
int vis[50];//标记某个字符串是否被使用 
//int vis[50]={1};只是给第一个元素即vis[0]赋值 
int canlink(string str1,string str2){
	for(int i=1;i<=min(str1.length(),str2.length());i++){//i是重合的长度 
		int flag=1;
		for(int j=0;jDFS+字符串处理 洛谷P1019_第1张图片
错误的重合部分比较程序:

/* int canlink(string str1,string str2){
	int j=0;
	while(str1[str1.length()-1-j]==str2[j]) j++;
	return j;
} //这种比法是错误的 */

DFS+字符串处理 洛谷P1019_第2张图片
方法二:进行拼接操作

#include
using namespace std;
#define maxn 100
int n;
int ans=0;
string word[maxn];
string beginn;
int used[maxn];
bool check(string s,string m,int k){
	int lens=s.length();
	for(int i=0;i=2) continue;
		int maxk=word[i].length();
		for(int j=1;j<=maxk;j++){
			if(check(now,word[i],j)){
				string temp=now;
				add(temp,word[i],j);
				if(temp==now) continue;
				used[i]++;
				dfs(temp);
				used[i]--;
			}
		}
	}
}
int main(){
	cin>>n;//每个字符串最多使用两次,那么将输入的字符串复制一次即可 
	for(int i=1;i<=n;i++) cin>>word[i];
	cin>>beginn;
	dfs(beginn);
	cout<

DFS+字符串处理 洛谷P1019_第3张图片
DFS+字符串处理 洛谷P1019_第4张图片

你可能感兴趣的:(C语言,OJ刷题,模板)