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

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

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

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

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

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

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

【动态规划】蓝肽子序列:最长公共子序列_第1张图片

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

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

你可能感兴趣的:(#,动态规划,动态规划,蓝桥杯,c++)