相對於上一篇 初級 ,這道題稍加深難度,下面這題,比上面多了一個最長子序列的輸出,測試一下理解程度,逆序過程html
第1行:字符串A 第2行:字符串B (A,B的長度 <= 1000)
輸出最長的子序列,若是有多個,隨意輸出1個。
abcicba abdkscab
abca
#include <stdio.h> #include <iostream> #include <string.h> const int maxn=1005; int dp[maxn][maxn]={0}; using namespace std; int main(){ char a[maxn],b[maxn],lcs[maxn]; int i,j; scanf("%s %s",a,b); int lena=strlen(a),lenb=strlen(b); for(i=1;i<=lena;i++){ for(j=1;j<=lenb;j++){ 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]); //0 1取不取,兩種狀況取最大 } } i=lena,j=lenb; int len=dp[lena][lenb]; lcs[len]='\0'; while(dp[i][j]){ if(dp[i][j]==dp[i-1][j]) i--; else if(dp[i][j]==dp[i][j-1]) j--; else lcs[--len]=a[i-1],i--,j--; //--len i-1 邊邊角角的小細節,,要注意下 } printf("%s\n",lcs); return 0; }