AT_dp_f LCS题解

题目描述

给定一个字符串 s 和一个字符串 t ,输出 s 和 t 的最长公共子序列。

输入格式

两行,第一行输入 s ,第二行输入 t 。

输出格式

输出 s 和 t 的最长公共子序列。如果有多种答案,输出任何一个都可以。

显示翻译

题意翻译

输入输出样例

输入 #1复制

axyb
abyxb

输出 #1复制

axb

输入 #2复制

aa
xayaz

输出 #2复制

aa

输入 #3复制

a
z

输出 #3复制

 

输入 #4复制

abracadabra
avadakedavra

输出 #4复制

aaadara

说明/提示

数据保证 s 和 t 仅含英文小写字母,并且 s 和 t 的长度小于等于3000。

思路

经典题目。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,n1,n2,a[3001],a2[3001],f[3001][3001],f2[3001][3001],f3[3001][3001],op=-1e9-7,s,t,s1,s2,u=0;
char ff[3001][3001],fg[104044];
char str1[3001],str2[3001];
bool bo[3001][3001];
int main(){
	cin>>str1;
	cin>>str2;
	size_t n13=strlen(str1);
	size_t n23=strlen(str2);
	n1=n13;
	n2=n23;
	//cout<<n13<<" "<<n23<<endl;
	for(int i=1;i<=n13;i++){
		for(int j=1;j<=n23;j++){
			if(f[(i-1)][j]>f[i][j-1]){
				f[i][j]=f[(i-1)][j];
				f2[i][j]=i-1;
				f3[i][j]=j;
			}
			else{
				f[i][j]=f[i][j-1];
				f2[i][j]=i;
				f3[i][j]=j-1;
			}
			if(str1[i-1]==str2[j-1]){
				if(f[(i-1)][j-1]+1>f[i][j]){
					f[i][j]=f[(i-1)][j-1]+1;
					ff[i][j]=str1[i-1];				
					f2[i][j]=i-1;
					f3[i][j]=j-1;	
					bo[i][j]=1;
				}
			}
			//cout<<i<<" "<<j<<" "<<f2[i][j]<<" "<<f3[i][j]<<endl;
		}
	}
	s=n1;
	t=n2;
	while(s>0||t>0){
		//cout<<ff[s][t];
		if(bo[s][t]==1) fg[++u]=ff[s][t];
		s1=s;
		s2=t;
		s=f2[s1][s2];
		t=f3[s1][s2];
	}
	for(int i=u;i>=1;i--){
		cout<<fg[i];
	}
	// for(int i=1;i<=n1;i++){
	// 	cout<<str[i];
	// }
	return 0;
}

posted @ 2025-10-22 20:59  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源