題目背景
大家都知道,基因可以看作乙個鹼基對序列。它包含了44種核苷酸,簡記作a,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。
在乙個人類基因工作組的任務中,生物學家研究的是:兩個基因的相似程度。因為這個研究對疾病的**有著非同尋常的作用。
題目描述
兩個基因的相似度的計算方法如下:
對於兩個已知基因,例如agtgatgagtgatg和gttaggttag,將它們的鹼基互相對應。當然,中間可以加入一些空鹼基-,例如:
這樣,兩個基因之間的相似度就可以用鹼基之間相似度的總和來描述,鹼基之間的相似度如下表所示:
那麼相似度就是:(-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。規定兩個基因的相似度為所有對應方法中,相似度最大的那個。
輸入格式
共兩行。每行首先是乙個整數,表示基因的長度;隔乙個空格後是乙個基因序列,序列中只含a,c,g,ta,c,g,t四個字母。1 \le1≤序列的長度\le 100≤100。
輸出格式
僅一行,即輸入基因的相似度。
輸入輸出樣例
輸入 #1複製
7 agtgatg
5 gttag
輸出 #1複製
14解題思路:
動態規劃首先應該列出動態轉移方程,定義f[i][j]為長度為i的鹼基序列1和長度為j的鹼基序列2的最有配對的相似度
f[i]
[j]=
max(f[i]
[j],f[i-1]
[j]+mach[str1[i]][
4])//鹼基序列1第i個鹼基與空白配對
f[i]
[j]=
max(f[i]
[j],f[i]
[j-1
]+mach[str2[j]][
4])//鹼基序列2第j個鹼基與空白配對
f[i]
[j]=
max(f[i]
[j],f[i-1]
[j-1
]+mach[str1[i]
][str2[j]])
//鹼基i與鹼基j相互配對
注意這裡需要初始化f[1…len1][0]和f[1…len2][0]、f[0][0],同時f[1…len1][1…len2]初始化為-∞(初始值為0會出錯,因為f[i][j]可能為負值)
同樣採取自底向上的方法,求出f[len1][len2]的最大值
**:
#include
#include
using
namespace std;
int str1[
150]
, str2[
150]
;int f[
150]
[150];
int mach[5]
[5]=
,,,,
};intmax
(int a,
int b)
intmain()
cin >> len2;
for(
int i =
1; i <= len2;
++i)
for(
int i =
0; i <= len1;
++i)
for(
int j =
0; j <= len2;
++j)
f[i]
[j]=
-1e8
; f[0]
[0]=
0;for(
int i =
1; i <= len1;
++i)
f[i][0
]= f[i -1]
[0]+ mach[str1[i]][
4];for
(int j =
1; j <= len2;
++j)
f[0]
[j]= f[0]
[j -1]
+ mach[str2[j]][
4];for
(int i=
1;i<=len1;
++i)
for(
int j =
1; j <= len2;
++j)
cout << f[len1]
[len2]
;return0;
}
洛谷P1140 相似基因(線性DP
大家都知道,基因可以看作乙個鹼基對序列。它包含了444種核苷酸,簡記作a,c,g,ta,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相...
洛谷P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如下 對於兩個已知...
洛谷P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了44種核苷酸,簡記作a,c,g,ta,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如...