最長公共子序列 + 記錄路徑 ( 51 NOD DP 教程 )
阿新 • • 發佈:2019-01-30
最長公共子序列和編輯距離一樣,都是先跑出 DP 二維陣列,然後再往回找,最長公共子序列需要倒序輸出。
這兩個題,先學一個,再自己推一個,效果很好。
程式碼如下 :
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define LL long long using namespace std; char B[1005]; char A[1005]; char Path[1005]; int dp[1005][1005],n,m; void Print() { int i=n; int j=m; int cnt=0; while(i>0 && j>0) { if(A[i-1]==B[j-1]) { Path[cnt++]=A[i-1]; i--;j--; } else if(dp[i-1][j]>dp[i][j-1]) i--; else j--; } for(i=cnt-1;i>=0;i--) printf("%c",Path[i]); printf("\n"); } int main() { while(~scanf("%s%s",A,B)) { n=strlen(A); m=strlen(B); for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { if(i==0 || j==0) dp[i][j]=0; else if(A[i-1] == B[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } Print(); } return 0; }