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;
}

浙公网安备 33010602011771号