51nod 1006 LCS

介绍一篇关于LCS的文章: 点击打开链接
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
 
   
abca

下面贴上代码:

#include <iostream>
using namespace std;
string A,B;
char K[1005];
int DPS[1005][1005],biao[1005][1005];
int main()
{
   ios::sync_with_stdio(false);
   cin>>A>>B;
   int len1=A.size(),len2=B.size();
   for(int i=1;i<=len1;i++)
    for(int j=1;j<=len2;j++)
   {
       if(A[i-1]==B[j-1])
       {
           DPS[i][j]=DPS[i-1][j-1]+1;
           biao[i][j]=1;
       }
       else if(DPS[i-1][j]>DPS[i][j-1])
       {
           DPS[i][j]=DPS[i-1][j];
           biao[i][j]=2;
       }
       else if(DPS[i-1][j]<=DPS[i][j-1])
       {
           DPS[i][j]=DPS[i][j-1];
           biao[i][j]=3;
       }
   }
   int x=DPS[len1][len2],n=len1,m=len2;
   while(x>=1)
   {
      if(biao[n][m]==1)
      {
          K[x]=A[n-1];
          n--;
          m--;
          x--;
      }
      else if(biao[n][m]==2)
      {
          n--;
      }
       else if(biao[n][m]==3)
      {
          m--;
      }
   }
    for(int i=1;i<=DPS[len1][len2];i++)
    {
        cout<<K[i];
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/whyckck/article/details/79998073
今日推荐