hdu 1159,最大公共子序列 LCS
阿新 • • 發佈:2018-12-18
比較基本的動態規劃
網上的資料都說得比較詳細,覺得其實直接看程式碼會比較直觀易懂
程式碼較短,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; } }