洛谷 P1140 相似基因(線性動態規劃)

2021-10-02 15:09:13 字數 2472 閱讀 2402

題目背景

大家都知道,基因可以看作乙個鹼基對序列。它包含了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。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如...