1. 程式人生 > >題解報告:hdu 1159 Common Subsequence

題解報告:hdu 1159 Common Subsequence

com span add letter 子序列 rom har 公共子序列 using

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1159

Problem Description 給定序列的子序列是給定的序列,其中有一些元素(可能沒有)被遺漏。 給定一個序列X = <x1,x2,...,xm>如果存在嚴格遞增的序列<i1,i2,...,則另一個序列Z = <z1,z2,...,zk>是X的子序列。 ...,ik>的索引,使得對於所有j = 1,2,...,k,xij = zj。 例如,Z = <a,b,f,c>是索引序列<1,2,4,6>的X = <a,b,c,f,b,c>的子序列。 給定兩個序列X和Y,問題是要找出X和Y的最大長度公共子序列的長度

程序輸入來自文本文件。 文件中的每個數據集都包含兩個代表給定序列的字符串。 序列由任意數量的空格分開。 輸入數據是正確的。 對於每組數據,程序在標準輸出上打印從單獨行開始的最大長度公共子序列的長度。 Sample Input abcfbc abfcab programming contest abcd mnp Sample Output 4 2 0 解題思路:基礎dp!求兩個字符串的最長公共子序列的長度,則dp[i][j]表示字符串s1的前i個字符與字符串s2的前j個字符構成的最長公共子序列的長度,推導式:當s1的第i個字符與s2的第j個字符相等時,dp[i][j]=dp[i-1][j-1]+1;否則dp[i][j]=max(dp[i-1][j],dp[i][j-1]),表示當前的dp[i][j]為s1的前i-1個字符與s2的前j個字符組成的最長公共子序列的長度即dp[i-1][j]和s1的前i個字符與s2的前j-1個字符組成的最長公共子序列的長度即dp[i][j-1]這兩者中的最大值。dp求解的核心就是枚舉到當前字符串中的某個字符,都要枚舉另外一個字符串中的每個字符,並記錄當前的最優解,這樣到最後就得到答案。 AC代碼:
 1
#include<bits/stdc++.h> 2 using namespace std; 3 char s1[1005],s2[1005]; 4 int dp[1005][1005]; 5 int main() 6 { 7 int len1,len2; 8 while(cin>>s1>>s2){ 9 memset(dp,0,sizeof(dp)); 10 len1=strlen(s1),len2=strlen(s2); 11 for(int i=1;i<=len1;i++){//i,j都為0的時候顯然公有的長度為0,所以從1開始
12 for(int j=1;j<=len2;j++){ 13 if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;//最長公共子序列的遞推式 14 else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 15 } 16 } 17 cout<<dp[len1][len2]<<endl; 18 } 19 return 0; 20 }

題解報告:hdu 1159 Common Subsequence