首页 > 其他分享 >旅行

旅行

时间:2024-01-19 12:12:20浏览次数:23  
标签:旅行 return LCS 字符 int dfs 个字符

裸的LCS问题。求长度并不困难,困难的是如何输出所有方案

所以这道题目可以作为DP输出方案的一道典型题目记住

我们一般的方法是记住当前状态是由哪个状态转移过去的,然后逐步递归输出

下面的代码的\(work\)表示两个串分别的前\(x\)个,前\(y\)个,LCS还剩下\(l\)个字符的所有方案(这里要用记忆化,不然的话会MLE或者TLE)

void work(int x,int y,int l)
{
    if(flag[x][y]) return;
	if(!l)
	{
	    G[x][y].push_back("");//G[x][y]表示两个串分别的前x个,前y个能够组成的LCS的所有子串
		return;
	}//如果所有字符都枚举完了就可以直接返回
	string temp;
	map<string,bool> mark;//去重标记
	if(s1[x-1]==s2[y-1])//一种转移
	{
		work(x-1,y-1,l-1);
		int p=G[x-1][y-1].size();
		for(int i=0;i<p;i++)
		{
			temp=G[x-1][y-1][i];
			temp+=s1[x-1];
			G[x][y].push_back(temp);
			mark[temp]=1;
		}
		return;//这里能返回的原因就是因为题目不要求输出重复的子串
	}
	if(f[x-1][y]==l)//一种转移
	{
		work(x-1,y,l);
		int p=G[x-1][y].size();
		for(int i=0;i<p;i++)
		{
			temp=G[x-1][y][i];
			if(mark.find(temp)!=mark.end()) continue;
			G[x][y].push_back(temp);
			mark[temp]=1;
		}
	}
	if(f[x][y-1]==l)//一种转移
	{
		work(x,y-1,l);
		int p=G[x][y-1].size();
		for(int i=0;i<p;i++)
		{
			temp=G[x][y-1][i];
			if(mark.find(temp)!=mark.end()) continue;
			G[x][y].push_back(temp);
			mark[temp]=1;
		}
	}
	flag[x][y]=1;
}

当然这道题目还有一种特殊的做法:我们枚举LCS当前长度的字符是什么。

首先看一下dfs状态

dfs(int x, int y, int k) 在\(a\)的前\(x\)个字符,\(b\)的前\(y\)个字符找LCS中的第\(k\)个字符

我们发现,当选择的字符一样时, 选择字符的位置越靠近\(x\),\(y\)越优(因为题目不要求输出重复的子串),所以直接找距离\(x\),\(y\)最近的字符\(a\)的位置即可

void dfs(int x, int y, int k)
{
    if (k == 0) { ve.pb(string(ans + 1)); return; }
    for (int i = 0; i < 26; ++i)//枚举当前字符是什么
    {
        int a = fa[x][i], b = fb[y][i];
        if (a < k || b < k || f[a][b] != k) continue;
        ans[k] = 'a' + i;
        dfs(a - 1, b - 1, k - 1);
    }
}

标签:旅行,return,LCS,字符,int,dfs,个字符
From: https://www.cnblogs.com/dingxingdi/p/17974351

相关文章

  • 图论 - 某进制分组 - P5304 旅行者
    P5304旅行者\(\mathtt{TAGS}\):多源多汇最短路,二进制分组\(\mathtt{ESTIMATION}\):非常好二进制分组,让我的大脑旋转题意简述给定\(k\)个点和一张有向图,求以这\(k\)个点为起点和终点的最短路中最短的一条的长度。First.怎么求多源多汇最短路solution.1超级源点和超级......
  • AEE K8执法记录仪助力文旅市场,为旅客营造安全舒适的旅行环境
    随着旅游业的蓬勃发展,越来越多的人选择选择通过旅游来放松身心,景区旅游成为地方经济的重要服务行业。为加强景区综合行政执法规范化,保障旅游秩序稳定,优化景区旅游环境,进一步提升游客体验感和安全感,山东某5A景区综合行政执法队为一线执勤人员配置了100台AEEDSJ-K8执法记录仪,用于景......
  • Android课程设计-安卓旅行日志APP+源代码+文档说明
    项目介绍简单的项目功能介绍:用户注册:邮箱填写、邮箱填写、密码填写、用户登录、用户忘记密码创建记事本:编写记事本、修改记事本、删除记事本、上传记事本数据管理:通过云服务器找回被删除的数据、本地笔记上传到云端、选择删除云端数据天气预报:获取用户当前位置的3天以内的天气情......
  • 基于SSM的旅行社管理系统的设计与实现
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅行社管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍......
  • Spring MVC 源码分析 - 一个请求的旅行过程
    在上一篇《WebApplicationContext容器的初始化》文档中分析了SpringMVC是如何创建两个容器的,其中创建RootWebApplicationContext 后,调用其refresh()方法会触发刷新事件,完成SpringIOC初始化相关工作,会初始化各种SpringBean到当前容器中,该系列文档暂不分析我们先来了解一......
  • 7-8 旅行售货员
    7-8旅行售货员某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小。输入格式:第一行为城市数n下面n行n列给出一个完全有向图,如i行j列表示第i个城市到第j个城市的距离。......
  • 记识读《旅行用心集》自序
    经请教Lerearath老师后,修改的正解:夫(それ)人々家(か)業(ぎやう)の[能]暇(いとま)に[爾]伊勢(いせ)参(さん)道(だう)に[爾]旅(たび)立(たち)するとて其(その)用意(ようい)をなし道(み[三]ち)連(つれ)と[等]約(やく)束(そく)しいつ何日(いつか)は[盤]吉日と定(さだめ)爰(ここ)彼(かしこ)より[里]餞別(せんべつ)物(もの)抔......
  • vim编辑器命令模式——撤销与时间旅行
    原创:厦门微思网络Vi介绍Vi编辑器是所有Unix及Linux系统下标准的编辑器,类似于windows系统下的notepad(记事本)编辑器,由于在Unix及Linux系统的任何版本,Vi编辑器是完全相同的,因此可以在其他任何介绍vi的地方都能进一步了解它,Vi也是Linux中最基本的文本编辑器,学会它后......
  • 初中英语优秀范文100篇-016An unforgettable Trip-一次难忘的旅行
    PDF格式公众号回复关键字:SHCZFW016记忆树1Lastyear,Iwenttomyfavoritecity,Beijing.翻译去年,我去了我最喜欢的城市,北京简化记忆城市句子结构这个句子可以分析为一个复合句,由主句和从句构成。主句是“Iwenttomyfavoritecity,Beijing”,主语是“I”......
  • P1081 [NOIP2012 提高组] 开车旅行
    题目有点长,一步一步来。预处理出每座城市两人分别会选择的下一座城市用set即可实现。倍增优化DP令\(f_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天会到达的城市。令\(ga_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天,小A行驶的路程。\(gb_{i,j}\)同理。答案枚......