動態規劃(dp)----公共子序列(LCS) 問題進一步理解(LCS輸入)

相對於上一篇 初級 ,這道題稍加深難度,下面這題,比上面多了一個最長子序列的輸出,測試一下理解程度,逆序過程html

 

 51nod1006

給出兩個字符串A B,求A與B的最長公共子序列(子序列不要求是連續的)
好比兩個串爲:
 
abcicba
abdkscab
 
ab是兩個串的子序列,abc也是,abca也是,其中abca是這兩個字符串最長的子序列。
Input

第1行:字符串A 第2行:字符串B (A,B的長度 <= 1000)

Output
輸出最長的子序列,若是有多個,隨意輸出1個。
 
Input示例
abcicba
abdkscab
 
Output示例
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;
}
相關文章
相關標籤/搜索