大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。
在乙個人類基因工作組的任務中,生物學家研究的是:兩個基因的相似程度。因為這個研究對疾病的**有著非同尋常的作用。
兩個基因的相似度的計算方法如下:
對於兩個已知基因,例如agtgatg和gttag,將它們的鹼基互相對應。當然,中間可以加入一些空鹼基-,例如:
這樣,兩個基因之間的相似度就可以用鹼基之間相似度的總和來描述,鹼基之間的相似度如下表所示:
那麼相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因為兩個基因的對應方法不唯一,例如又有:
相似度為:(-3)+5+5+(-2)+5+(-1)+5=14。規定兩個基因的相似度為所有對應方法中,相似度最大的那個。
輸入格式:
共兩行。每行首先是乙個整數,表示基因的長度;隔乙個空格後是乙個基因序列,序列中只含a,c,g,t四個字母。1<=序列的長度<=100。
輸出格式:
僅一行,即輸入基因的相似度。
輸入樣例#1:
7 agtgatg輸出樣例#1:5 gttag
14solution:本題是一道比較典型的$dp$。
我們先考慮定義狀態,$f[i][j]$表示匹配到了$s1$的$i$位置和$s2$的$j$位置時,能匹配到的最大基因相似度,那麼目標狀態即$f[n][m]$。
轉換鹼基,將$a\leftrightarrow 0,c\leftrightarrow 1,g\leftrightarrow 2,t\leftrightarrow 3,-\leftrightarrow 4$,然後把$s1,s2$按上述方法對映為$a,b$,同時建立$w[5][5]$陣列,$w[i][j]$表示$i-j$配對的值。
先考慮初始狀態,$f[i][j],i\in [1,n],\;j\in [1,m]$初始化為負無窮,因為可以與空鹼基匹配,所以初始時$f[i][0]=f[i-1][0]+w[a[i]][4],i\in [1,n]$表示$s1$的每位與空鹼基配對的值,$f[0][i]=f[0][i-1]+w[b[i]][4],i\in [1,m]$含義同上。
1、$f[i][j]=max(f[i][j],f[i][j-1]+w[b[j]][4])$表示$s1_i$在$s2_j$位置時與空鹼基配對;
2、$f[i][j]=max(f[i][j],f[i-1][j]+w[a[i]][4])$表示$s2_j$在$s1_i$位置時與空鹼基配對;
3、$f[i][j]=max(f[i][j],f[i-1][j-1]+w[a[i]][b[j]])$表示$s1_i$和$s2_j$配對。
容易想到對於$s1$的每個位置,都可以與$s2$的每個位置匹配一次,所以整體列舉複雜度為$o(nm)$($n$為$s1$長度,$m$為$s2$長度)。
最後輸出目標狀態$f[n][m]$就$ok$了。
**:
#include#define il inline#define ll long long
using
namespace
std;
const
int inf=233333333
;int n,m,f[105][105],a[105],b[105
];int w[5][5]=,,,
,};char s1[105],s2[105
];il
void change(char *s,int *a,intl)}
intmain()
cout
<
return0;
}
P1140 相似基因
題意 給出兩個序列,讓我們進行配對,配對的時候,我們可以在其中加空數 兩個序列都可以 題意給出每種配對的權值,讓我們求如何配對權值最大 思路 我們先預處理出配對的權值情況,再預處理出當兩個序列各自沒開始匹配,而另外乙個序列匹配的多少個空數的情況 為何?因為我們從1開始,需要以0這個情況為基準 然後,...
P1140 相似基因 詳解
此題與lcs非常相似。因為是兩個串的比對,所以我們很容易想到用f i j 來表示a串的前i個鹼基和b串的前j個鹼基配出的最大相似度 每乙個鹼基都配對乙個鹼基,或者配空鹼基 那麼這個狀態的前驅就有三種 f i j 1 b j 與空鹼基的相似度 f i 1 j a i 與空鹼基的相似度 f i 1 j ...
洛谷P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如下 對於兩個已知...