相似基因(洛谷-P1140)
題目描述
大家都知道,基因可以看作一個(gè)堿基對(duì)序列。它包含了?4?種核苷酸,簡(jiǎn)記作?A,C,G,T?。生物學(xué)家正致力于尋找人類(lèi)基因的功能,以利用于診斷疾病和發(fā)明藥物。
在一個(gè)人類(lèi)基因工作組的任務(wù)中,生物學(xué)家研究的是:兩個(gè)基因的相似程度。因?yàn)檫@個(gè)研究對(duì)疾病的治療有著非同尋常的作用。
題目描述
兩個(gè)基因的相似度的計(jì)算方法如下:
對(duì)于兩個(gè)已知基因,例如?AGTGATG 和?GTTAG ,將它們的堿基互相對(duì)應(yīng)。當(dāng)然,中間可以加入一些空堿基 -,例如:
這樣,兩個(gè)基因之間的相似度就可以用堿基之間相似度的總和來(lái)描述,堿基之間的相似度如下表所示:
那么相似度就是:?(-3)+5+5+(-2)+(-3)+5+(-3)+5=9 。因?yàn)閮蓚€(gè)基因的對(duì)應(yīng)方法不唯一,例如又有:
相似度為:?(-3)+5+5+(-2)+5+(-1)+5=14 。規(guī)定兩個(gè)基因的相似度為所有對(duì)應(yīng)方法中,相似度最大的那個(gè)。
輸入輸出格式
輸入格式:
共兩行。每行首先是一個(gè)整數(shù),表示基因的長(zhǎng)度;隔一個(gè)空格后是一個(gè)基因序列,序列中只含?A,C,G,T 四個(gè)字母。?1 ≤?序列的長(zhǎng)度 ≤100?。
輸出格式:
僅一行,即輸入基因的相似度。
輸入輸出樣例
輸入樣例#1:
7 AGTGATG
5 GTTAG
輸出樣例#1:
14
源代碼
#include<iostream> #include<string> using namespace std;int max(int x,int y) {if(x>y)return x;elsereturn y; }int main() { int calculate[5][5]={{5,-1,-2,-1,-3},{-1,5,-3,-2,-4},{-2,-3,5,-2,-2},{-1,-2,-2,5,-1},{-3,-4,-2,-1,0}};//題設(shè)所給相似度表格int a,b;//基因長(zhǎng)度string gene_a,gene_b;//基因序列int num_a[110],num_b[110];//用于將基因序列轉(zhuǎn)為編碼存儲(chǔ)的數(shù)組int dp[110][110]={0};//初始化int i,j;cin>>a>>gene_a;//基因序列acin>>b>>gene_b;//基因序列bfor(int i=1;i<=a;i++)for(int j=1;j<=b;j++)dp[i][j]=-1e8; //初始化為一極小值for(i=1;i<=a;i++)//將基因序列a轉(zhuǎn)為題設(shè)所給相似度表格中的數(shù)字代碼{if(gene_a[i-1]=='A') num_a[i]=0;if(gene_a[i-1]=='C') num_a[i]=1;if(gene_a[i-1]=='G') num_a[i]=2;if(gene_a[i-1]=='T') num_a[i]=3;}for(i=1;i<=b;i++)//將基因序列b轉(zhuǎn)為題設(shè)所給相似度表格中的數(shù)字代碼{if(gene_b[i-1]=='A') num_b[i]=0;if(gene_b[i-1]=='C') num_b[i]=1;if(gene_b[i-1]=='G') num_b[i]=2;if(gene_b[i-1]=='T') num_b[i]=3;}/*特判情況第一個(gè)基因第1個(gè)與第二個(gè)基因第0個(gè)匹配時(shí),與空堿基匹配的值相同,可視為與空堿基匹配同理,第二個(gè)基因第1個(gè)與第一個(gè)基因第0個(gè)匹配時(shí),與空堿基匹配的值相同*/for(i=1;i<=a;i++) dp[i][0]=dp[i-1][0]+calculate[num_a[i]][4];for(i=1;i<=b;i++) dp[0][i]=dp[0][i-1]+calculate[num_b[i]][4];/*比較堿基對(duì)相似度,共三種情況:①不插入空堿基,直接進(jìn)行配對(duì)②序列a不變,在序列b中插入空堿基③序列b不變,在序列a中插入空堿基*/for(i=1;i<=a;i++){for(j=1;j<=b;j++){dp[i][j]=max( dp[i][j] , dp[i][j-1]+calculate[ num_b[j] ][4] );//序列a中插空堿基 dp[i][j]=max( dp[i][j] , dp[i-1][j]+calculate[ num_a[i] ][4] );//序列b中插空堿基dp[i][j]=max( dp[i][j] , dp[i-1][j-1]+calculate[ num_a[i] ][ num_b[j] ] );//不插入直接配對(duì)}}cout<<dp[a][b];return 0; }?
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的相似基因(洛谷-P1140)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 训练日志 2018.9.12
- 下一篇: 暑期训练日志----2018.7.30