码迷,mamicode.com
首页 > 其他好文 > 详细

P1140 相似基因

时间:2020-03-26 23:11:58      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:lap   one   opened   none   class   为我   思路   using   close   

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

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

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

     为何?因为我们从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 相似基因

标签:lap   one   opened   none   class   为我   思路   using   close   

原文地址:https://www.cnblogs.com/pangbi/p/12578151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!