栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【动态规划】蓝肽子序列:最长公共子序列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【动态规划】蓝肽子序列:最长公共子序列

L 星球上的生物由蛋蓝质组成,每一种蛋蓝质由一类称为蓝肽的物资首尾连接成一条长链后折叠而成。

生物学家小乔正在研究 L 星球上的蛋蓝质。她拿到两个蛋蓝质的蓝肽序列,想通过这两条蓝肽序列的共同特点来分析两种蛋蓝质的相似性。

具体的,一个蓝肽可以使用 1 至 5 个英文字母表示,其中第一个字母大写,后面的字母小写。一个蛋蓝质的蓝肽序列可以用蓝肽的表示顺序拼接而成。

在一条蓝肽序列中,如果选取其中的一些位置,把这些位置的蓝肽取出,并按照它们在原序列中的位置摆放,则称为这条蓝肽的一个子序列。蓝肽的子序列不一定在原序列中是连续的,中间可能间隔着一些未被取出的蓝肽。

如果第一条蓝肽序列可以取出一个子序列与第二条蓝肽序列中取出的某个子序列相等,则称为一个公共蓝肽子序列。

给定两条蓝肽序列,找出他们最长的那个公共蓝肽子序列的长度。

首先,要把每个单词提取出来,放在两个数组中。

vecotora;
void split(){
  int i=0;
  while(i='a'&&s[j]<='z')j++;
    a.push_back(s.substr(i,j-i));
    i=j;
  }
}

然后,用求两个数组的最长公共子序列。

dp[i][j]=max(  dp[i-1][j-1]+1 ( s[i]==s[j] )  ,dp[i-1][j],d[i][j-1])

注意:为了不用分类讨论,下标从1开始。所以要对数组的所有数右移1个下标。

#include 
#include
#include
using namespace std;
vectora1;
vectora2;
string s1;
string s2;
int n1,n2;
void split1(){
  int i=0;
  while(i='a'&&s1[j]<='z')j++;
    a1.push_back(s1.substr(i,j-i));
    i=j;
  }
 
}
void split2(){
  int i=0;
  while(i='a'&&s2[j]<='z')j++;
    a2.push_back(s2.substr(i,j-i));
    i=j;
  }
}
int dp[1002][1002];
int main()
{
  cin>>s1;
  cin>>s2;
  n1=s1.size();
  n2=s2.size();
  split1();
  split2();
  // for(int i=0;ib1;
  b1.resize(a1.size()+1);
  vectorb2;
  b2.resize(a2.size()+1);
  for(int i=0;i

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957854.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号