uva 10405 Longest Common Subsequence 最长公共子序列 LCS

来源:互联网 发布:易语言源码下载 编辑:程序博客网 时间:2024/05/27 20:10

        两个月没看还真忘了,-  -b

       动态规划的一个计算两个序列的最长公共子序列的方法如下:

  以两个序列 X、Y 为例子:
  设有二维数组 f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:
  f[1][1] = same(1,1);
  f[i,j] = max{f[i-1][j -1] + same(i,j),f[i-1,j],f[i,j-1]}
  其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。
  此时,f[j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。
  该算法的空间、时间复杂度均为O(n^2),经过优化后,空间复杂度可为O(n)。

#include<stdio.h>#include<string.h>int dp[1000][1000];int max(int a,int b){    if(a>b)    return a;    else    return b;}int main(){    int i,j,k,la,lb,m,n;    char a[1001],b[1001];    while(gets(a)!=NULL&&gets(b)!=NULL)    {        memset(dp,0,sizeof(dp));        la=strlen(a);        lb=strlen(b);        for(i=1;i<=la;i++)        for(j=1;j<=lb;j++)        {            if(a[i-1]==b[j-1])            dp[i][j]=dp[i-1][j-1]+1;            else            dp[i][j]=max(dp[i][j-1],dp[i-1][j]);        }        printf("%d\n",dp[la][lb]);    }return 0;}


原创粉丝点击