ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1006 最长公共子序列Lcs

2019-08-26 21:43:40  阅读:227  来源: 互联网

标签:Lcs Mlen int direc 序列 1006 1010 dp


给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

输出
输出最长的子序列,如果有多个,随意输出1个。

输入样例
abcicba
abdkscab


输出样例
abca

dp[i][j]:i表示A j表示B 的每一个字符
dp表示I位Aj位B的公共子串的最长长度
若相同:dp[i][j]=dp[i-1][j-1]+1;
否则:dp[i][j]-max(dp[i-1][j],dp[i][j-1])
因为要输出字串,就用一个direct记录转移的方向

#include<bits/stdc++.h>
using namespace std;
char a[1010],b[1010];
int Mlen[1010][1010],direc[1010][1010];//0左 1左上 2上
void print(int x,int y)
{
  if(x<0||y<0) return;
  if(direc[x][y]==2)
   print(x-1,y);
  else if(direc[x][y]==0)
   print(x,y-1);
  else
  {
   print(x-1,y-1);
   cout<<a[x];
  }
}  
int main()
{
 cin>>a>>b;
 int lena=strlen(a),lenb=strlen(b);
 memset(direc,0,sizeof(direc)); 
 for(int i=0;i<lena;i++)
  for(int j=0;j<lenb;j++)
  {
   //0-1 越界 特判
   if((i+j)==0)
   {
    if(a[i]==b[j]) 
  {Mlen[i][j]=1;direc[i][j]=1;} 
  else Mlen[i][j]=0; 
 }
   if(i==0||j==0)
   {
    if(a[i]==b[j]) 
  {
   Mlen[i][j]=1;direc[i][j]=1;
  }
  else 
  {
   Mlen[i][j]=(i==0?Mlen[i][j-1]:Mlen[i-1][j]); 
   direc[i][j]=(j==0?2:0);
  } continue;
 }
 //dp
   if(a[i]==b[j])
   {
    Mlen[i][j]=Mlen[i-1][j-1]+1;
  direc[i][j]=1;   
 }
 else
 {
  if(Mlen[i-1][j]>=Mlen[i][j-1])
  {
   Mlen[i][j]=Mlen[i-1][j];
   direc[i][j]=2;
  }
  else
  {
   Mlen[i][j]=Mlen[i][j-1];
  }
 }
  }
  print(lena-1,lenb-1);
  cout<<endl;
  /*for(int i=0;i<lena;i++)
  {
   for(int j=0;j<lenb;j++)
    cout<<Mlen[i][j]<<" ";
   cout<<endl;
  }*/
  return 0;
}

标签:Lcs,Mlen,int,direc,序列,1006,1010,dp
来源: https://blog.csdn.net/weixin_43540515/article/details/100086080

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有