大家都知道,基因可以看作乙個鹼基對序列。它包含了444種核苷酸,簡記作a,c,g,ta,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。
在乙個人類基因工作組的任務中,生物學家研究的是:兩個基因的相似程度。因為這個研究對疾病的**有著非同尋常的作用。
兩個基因的相似度的計算方法如下:
對於兩個已知基因,例如agtgatgagtgatgagtgatg和gttaggttaggttag,將它們的鹼基互相對應。當然,中間可以加入一些空鹼基-,例如:
這樣,兩個基因之間的相似度就可以用鹼基之間相似度的總和來描述,鹼基之間的相似度如下表所示:
那麼相似度就是:(−3)+5+5+(−2)+(−3)+5+(−3)+5=9(-3)+5+5+(-2)+(-3)+5+(-3)+5=9(−3)+5+5+(−2)+(−3)+5+(−3)+5=9。因為兩個基因的對應方法不唯一,例如又有:
相似度為:(−3)+5+5+(−2)+5+(−1)+5=14(-3)+5+5+(-2)+5+(-1)+5=14(−3)+5+5+(−2)+5+(−1)+5=14。規定兩個基因的相似度為所有對應方法中,相似度最大的那個。
共兩行。每行首先是乙個整數,表示基因的長度;隔乙個空格後是乙個基因序列,序列中只含a,c,g,ta,c,g,ta,c,g,t四個字母。1≤1 \le 1≤序列的長度≤100 \le 100≤100。
僅一行,即輸入基因的相似度。
輸入 #1
7 agtgatg輸出 #1這是一道線性dp題,藍書上說得好,如果乙個動態規劃的演算法包含多個維度,但在每個維度上都具有線性變化的階段,這同樣稱為線性dp。這道題一看有兩個字串,聯想到另一道題「編輯距離」,可以想到要開乙個二維陣列來儲存,即dp[i][j]表示a串的1到i個鹼基與b串的1到j個鹼基的相似度。狀態找到後開始寫轉移方程。由題意得,不考慮邊界的話一共有三種情況,即dp[i][j]可能等於:5 gttag
1.dp[i-1][j-1]+rela(a[i],b[j]).這表示a[i]與b[j]兩個鹼基彼此配對,其中rela(p,q)表示鹼基p和鹼基q的相似度。
2.dp[i-1][j]+rela(a[i],' ').這表示a[i]與空鹼基配對。這裡要注意到動態規劃裡無後效性的概念,不用去管a的前i-1個鹼基與b的前j個鹼基如何配對,只需要分析眼前情況。
3.dp[i][j-1]+rela(b[j],' ').這表示b[j]與空鹼基配對。
最終要在這三者中取最大就得到轉移方程。輸出的答案存在dp[lena][lenb]中。lena,lenb分別表示a,b串的長度。
#include usingnamespace
std;
char a[105],b[105
];int
lena,lenb;
int dp[210][210]=; //
dp[i][j]表示a的第i個與b的第j個到之前的相似度
mapm;
int pos=0
;int rela[5][5]=//
二維陣列儲存鹼基與鹼基之間的相似度
, ,,,
};int mmax(int a,int b,int
c)int
main()
for(j=1;j<=lenb;j++)
for(i=1;i<=lena;i++)}}
cout
/輸出答案。這裡注意不要習慣性的寫成dp[lena-1][lenb-1],再次回顧dp[i][j]的定義,是「第i個」
return0;
}
洛谷 P1140 相似基因(線性動態規劃)
題目背景 大家都知道,基因可以看作乙個鹼基對序列。它包含了44種核苷酸,簡記作a,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。題目描述 兩個基因...
洛谷P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如下 對於兩個已知...
洛谷P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了44種核苷酸,簡記作a,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如...