1786 - 相似基因

大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。

在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下:

对于两个已知基因,例如AGTGATGGTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:

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:宋体;">&nbsp;</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;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题