P1140 相似基因

Posted pangbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1140 相似基因相关的知识,希望对你有一定的参考价值。

题意:给出两个序列,让我们进行配对,配对的时候,我们可以在其中加空数;两个序列都可以

    题意给出每种配对的权值,让我们求如何配对权值最大

思路:我们先预处理出配对的权值情况,再预处理出当两个序列各自没开始匹配,而另外一个序列匹配的多少个空数的情况

     为何?因为我们从1开始,需要以0这个情况为基准

        然后,我们就开始跑dp,有3种情况,详情写在代码中

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e3+10;
 4 const int tab[5][5]=
 5 {
 6     {5,-1,-2,-1,-3},
 7     {-1,5,-3,-2,-4},
 8     {-2,-3,5,-2,-2},
 9     {-1,-2,-2,5,-1},
10     {-3,-4,-2,-1,0}
11 };
12 int la,lb;
13 std::string sa,sb;
14 int a[N],b[N];
15 int dp[N][N];
16 int main()
17 {
18     std::cin>>la>>sa>>lb>>sb;
19     for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++) dp[i][j]=-2e8;
20     for(int i=1;i<=la;i++){
21         if(sa[i-1]==A) a[i]=0;
22         if(sa[i-1]==C) a[i]=1;
23         if(sa[i-1]==G) a[i]=2;
24         if(sa[i-1]==T) a[i]=3;
25     }
26     for(int i=1;i<=lb;i++){
27         if(sb[i-1]==A) b[i]=0;
28         if(sb[i-1]==C) b[i]=1;
29         if(sb[i-1]==G) b[i]=2;
30         if(sb[i-1]==T) b[i]=3;
31     }
32     for(int i=1;i<=la;i++) dp[i][0]=dp[i-1][0]+tab[a[i]][4];
33     for(int i=1;i<=lb;i++) dp[0][i]=dp[0][i-1]+tab[b[i]][4];
34     for(int i=1;i<=la;i++)
35     for(int j=1;j<=lb;j++){
36         dp[i][j]=max(dp[i][j],dp[i][j-1]+tab[b[j]][4]);  //b序列配对a序列空
37         dp[i][j]=max(dp[i][j],dp[i-1][j]+tab[a[i]][4]);  //a序列配对b序列空
38         dp[i][j]=max(dp[i][j],dp[i-1][j-1]+tab[a[i]][b[j]]); //a,b序列当前位置互相匹配
39     }
40     printf("%d",dp[la][lb]);
41     return 0;
42 }
View Code

 

以上是关于P1140 相似基因的主要内容,如果未能解决你的问题,请参考以下文章

P1140 相似基因

动态规划 洛谷P1140 相似基因

P1140 相似基因 (dp)

P1140 相似基因

P1140 相似基因

算法竞赛入门码蹄集进阶塔335题(MT3330-3335)