1. 程式人生 > >hdu 1159,最大公共子序列 LCS

hdu 1159,最大公共子序列 LCS

比較基本的動態規劃
網上的資料都說得比較詳細,覺得其實直接看程式碼會比較直觀易懂
程式碼較短,dp[i][j]表示X的i位和Y的j位之前的最長公共子序列的長度,X和Y是輸入的兩個序列


#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 1001
#define mst(s,t) memset(s,t,sizeof(s))

int dp[MAXN][MAXN];
char str1[MAXN];
char str2[MAXN];
int len1,len2;

int main(){
	while(cin>>str1>>str2){
		mst(dp,0);
		len1=strlen(str1);
		len2=strlen(str2);
        //一開始馬上想到的是以X、Y序列的兩個前子序列的長度和為順序,例如先算所有和(i)為2的,然後和為3的,為4的( (1,3),(2,2),(3,1) )…
		for(int i=2;i<=len1+len2;i++){
			for(int j=1;j<i&&j<=len1;j++){
				if(str1[j-1]==str2[i-j-1])
					dp[j][i-j]=dp[j-1][i-j-1]+1;
				else dp[j][i-j]=max(dp[j-1][i-j],dp[j][i-j-1]);
			}
		}
		//實際上這也是可行的順序,這樣就可以
		// for(int i=1;i<=len1;i++)
		//    for(int j=1;j<=len2;j++) {…}
		cout<<dp[len1][len2]<<endl;
	}
}