Educational DP Contest F - LCS (LCS输出路径)

-
题意:有两个字符串,求他们的最长公共子序列并输出.
-
题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出.
-
代码:
char s[N],t[N]; int dp[10000][10000]; int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); scanf("%s %s",s+1,t+1); int len1=strlen(s+1); int len2=strlen(t+1); for(int i=1;i<=len1;++i){ for(int j=1;j<=len2;++j){ if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } int i=len1,j=len2; char ans[N]; int cnt=0; while(dp[i][j]){ if(s[i]==t[j]){ ans[++cnt]=s[i]; i--; j--; } else if(dp[i][j]==dp[i-1][j]) i--; else if(dp[i][j]==dp[i][j-1]) j--; } for(int i=cnt;i>=1;--i) printf("%c",ans[i]); return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号