51Nod 1006-最长公共子序列Lcs

基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题
 收藏
 关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
abca

题解:动态规划的基础题,白皮书上写的有一个是求最长公共子序列的个数,这个是输出最大子序列。做法就是先打一个表,再判断是否可以满足a[i]=b[j]的条件。我有一个地方卡了很久,就是那个判断是否相等的条件,因该是a[i-1],之前我写成a[i]。

#include<bits/stdc++.h>
using namespace std;
int dp[1000+50][1000+50];
int main()
{
	char a[1000+50];
	char b[1000+50];
	char c[1000+50];
	scanf("%s",a);
	scanf("%s",b);
	int len1=strlen(a),len2=strlen(b);
	for(int i=0;i<len1;i++)
	{
		for(int j=0;j<len2;j++)
		{
			if(a[i]==b[j])
			{
				dp[i+1][j+1]=dp[i][j]+1;
			}
			else
			{
				dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
			}
		}
	}
	int i=len1,j=len2,k=0;
	while(i>0&&j>0)
	{
		if(a[i-1]==b[j-1])
		{
			c[k++]=a[i-1];
			i--;
			j--;
		}else
		if(dp[i-1][j]>dp[i][j-1])
		{
			i--;
		}else
		{
			j--;
		}
	}
	for(int ii=k-1;ii>=0;ii--)
	printf("%c",c[ii]);
	return 0;
}


全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
11-13 20:16
已编辑
厦门理工学院 软件测试
专业嗎喽:硕佬,把学校背景放后面几段,学校背景双非还学院,让人看了就不想往下看。 把实习经历和个人奖项放前面,用数字化简述自己实习的成果和掌握的技能,比如负责项目一次通过率90%,曾4次发现项目潜在问题风险为公司减少损失等等
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务