1786 - 相似基因
大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。
在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下:
对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:
|
A |
G |
T |
G |
A |
T |
- |
G |
|
- |
G |
T |
- |
- |
T |
A |
G |
这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:
<span style="font-family:宋体;">那么相似度就是:</span><span style="font-family:宋体;">(-3)+5+5+(-2)+(-3)+5+(-3)+5=9</span><span style="font-family:宋体;">。因为两个基因的对应方法不唯一,例如又有:<span></span></span>
<table class="MsoNormalTable" style="border-collapse:collapse;border:none;" cellpadding="0" cellspacing="0" border="1">
<tbody>
<tr>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">A</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">G</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">T</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">G</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">A</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">T</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">G</span>
</p>
</td>
</tr>
<tr>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">-</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">G</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">T</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">T</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">A</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">-</span>
</p>
</td>
<td style="border:solid windowtext 1.0pt;" valign="top" width="19">
<p class="MsoNormal">
<span style="font-family:宋体;">G</span>
</p>
</td>
</tr>
</tbody>
</table>
<span style="font-family:宋体;"> </span>
<span style="font-family:宋体;">相似度为:<span>(-3)+5+5+(-2)+5+(-1)+5=14</span>。规定两个基因的相似度为所有对应方法中,相似度最大的那个。<span></span></span>
题目输入
共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1<=序列的长度<=100。
题目输出
仅一行,即输入基因的相似度。
输入/输出样例
题目输入
7 AGTGATG 5 GTTAG
题目输出
14
C++解答
#include <iostream> #include <algorithm> using namespace std; const int N(103); int f[N][N]={0},ACGT[6][6]={0},g[2][N]={0}; int main() { for(int i=1;i<=5;i++) switch (i) { case 1: for(int j=1;j<=5;j++){int temp[6]={0,5,-1,-2,-1,-3};ACGT[i][j]=temp[j];}break; case 2: for(int j=1;j<=5;j++){int temp[6]={0,-1,5,-3,-2,-4};ACGT[i][j]=temp[j];}break; case 3: for(int j=1;j<=5;j++){int temp[6]={0,-2,-3,5,-2,-2};ACGT[i][j]=temp[j];}break; case 4: for(int j=1;j<=5;j++){int temp[6]={0,-1,-2,-2,5,-1};ACGT[i][j]=temp[j];}break; case 5: for(int j=1;j<=5;j++){int temp[6]={0,-3,-4,-2,-1,0};ACGT[i][j]=temp[j];}break; } int x(0);char y; int l1,l2; for(int i=0;i<2;i++) { cin>>x; if(i==0) l1=x; else l2=x; for(int j=1;j<=x;j++) { cin>>y; switch(y) { case 'A': g[i][j]=1;break; case 'C': g[i][j]=2;break; case 'G': g[i][j]=3;break; case 'T': g[i][j]=4;break; } } } for(int i=1;i<=l1;i++) f[i][0]=f[i-1][0]+ACGT[g[0][i]][5]; for(int i=1;i<=l2;i++) f[0][i]=f[0][i-1]+ACGT[5][g[1][i]]; for(int i=1;i<=l1;i++) for(int j=1;j<=l2;j++) { int x(g[0][i]),y(g[1][j]); f[i][j]=-100000; f[i][j]=max(f[i][j],f[i-1][j-1]+ACGT[x][y]); f[i][j]=max(f[i][j],f[i-1][j-1]+ACGT[x][5]+ACGT[y][5]); f[i][j]=max(f[i][j],f[i-1][j]+ACGT[x][5]); f[i][j]=max(f[i][j],f[i][j-1]+ACGT[y][5]); } cout<<f[l1][l2]<<endl; return 0; }