1. 程式人生 > >動態規劃之最長公共子序列(LCS)

動態規劃之最長公共子序列(LCS)

int tdi -s can 數組下標 include har 遞推 最長公共子序列

在字符串S中按照其先後順序依次取出若幹個字符,並講它們排列成一個新的字符串,這個字符串就被稱為原字符串的子串

有兩個字符串S1和S2,求一個最長公共子串,即求字符串S3,它同時為S1和S2的子串,且要求它的長度最長,就是這裏的

最長公共子序列問題。

最長公共子序列問題的遞推條件如下:dp[i][j]表示s1前i個字符組成的前綴子串與s2前j個字符組成的前綴子串的最長公共子序列

dp[0][ j ]( 0<=j<=m) = 0

dp[ i ][0]( 0<=i<=n) = 0

dp[ i ] [ j ] = dp[ i-1][ j-1] + 1 ( s1[i]==s2[j] )

dp[ i ][ j ] = max{ dp[i-1][ j ],dp[i][ j-1] } ( s1[i] != s2[j] )

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int dp[100][100];
int max( int a,int b)
{
    //選取最大值
    return a>b? a:b;
}
int main()
{
    char s1[101],s2[101];
    int i,j;
    int l1,l2;
    while
( scanf("%s%s",s1,s2)!=EOF){ l1 = strlen(s1); l2 = strlen(s2); for( i=0; i<=l1; i++) dp[i][0] = 0; for( j=1; j<=l2; j++) dp[0][j] = 0; for( i=1; i<=l1; i++){ for( j=1; j<=l2; j++){ if( s1[i-1]!=s2[j-1]) //字符串數組下標從0開始 dp[i][j] = max( dp[i][j-1
],dp[i-1][j]); else dp[i][j] = dp[i-1][j-1]+1; } } printf("%d\n",dp[l1][l2]); } return 0; }

動態規劃之最長公共子序列(LCS)