相似基因
时间限制: 1 Sec 内存限制: 128 MB
提交: 19 解决: 12
[提交][状态][讨论版]
题目描述
大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。
在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下:
对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:
这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:
相似度为:(-3)+5+5+(-2)+5+(-1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。
在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下:
对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:
A | G | T | G | A | T | - | G |
- | G | T | - | - | T | A | G |
那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因为两个基因的对应方法不唯一,例如又有:
A | G | T | G | A | T | G |
- | G | T | T | A | - | G |
输入
共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1<=序列的长度<=100。
输出
仅一行,即输入基因的相似度。
样例输入
7 AGTGATG 5 GTTAG
样例输出
14
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=500005; const int M=1005; ll power(ll a,int b,ll c) {ll ans=1;while(b) {if(b%2==1) {ans=(ans*a)%c;b--;}b/=2;a=a*a%c;}return ans;} int s[6][6]= {{0,0,0,0,0,0}, {0,5,-1,-2,-1,-3}, {0,-1,5,-3,-2,-4}, {0,-2,-3,5,-2,-2}, {0,-1,-2,-2,5,-1}, {0,-3,-4,-2,-1,0} }; int change(char a) { if(a=='A') return 1; if(a=='G') return 3; if(a=='C') return 2; if(a=='T') return 4; else return 5; } int main() { int a1,b1; string as,bs; int a[101],b[101]; int dp[101][101]; cin>>a1>>as>>b1>>bs; for(int i=0; i<a1; i++) a[i+1]=change(as[i]); for(int i=0; i<b1; i++) b[i+1]=change(bs[i]); for(int i=1; i<=a1; i++) dp[0][i]=dp[0][i-1]+s[5][a[i]]; for(int i=1; i<=b1; i++) dp[i][0]=dp[i-1][0]+s[b[i]][5];//cout<<"a"; for(int i=1; i<=b1; i++) for(int j=1; j<=a1; j++) dp[i][j]=max(max( dp[i-1][j-1]+s[b[i]][a[j]], dp[i-1][j]+s[5][b[i]]), dp[i][j-1]+s[5][a[j]]); cout<<dp[b1][a1]<<endl; return 0; }