洛谷傳送:
題意簡述:給兩個鹼基序列a和b和乙個鹼基匹配的相似度錶(權值表),找出兩個序列匹配的相似度(最大權值和)。
這一題在洛谷是普及的難度,但困擾了很久,有點難受。
既然是dp,按照套路來分析一波:
一、確定狀態
求什麼就設什麼,確定狀態dp[i][j]為當a中的前i個元素和空字元組成的序列和b中前j個元素和空字元組成的序列可以匹配的最大權值和。
從這裡會隱約感到和最長lcs的狀態定義是十分相似的。
二、刻畫最優子結構
對於序列a和b,採用和lcs一樣的分析方式。每次比較最後的兩個元素。
有序列a:agtgatg和序列b:gttag,i 和 j 分別是當前指向的元素位置。
從題目可以看出,可以在a和b的序列中加入空鹼基,所以每次最後一位元素比較的時候會出現以下的三種情況:
ⅰ. a新增空鹼基,b不加;
ⅱ. b新增空鹼基,a不加;
ⅲ. a,b都不新增空鹼基。
這樣就可以得到這時最優子結構,兩個序列的最大權值和就是其去掉最後乙個元素的子串行的最大權值和+最後乙個元素匹配值。
三、狀態轉移方程
從題目可以看出,可以在a和b的序列中加入空鹼基,所以每次最後一位元素比較的時候會出現以下的三種情況:
所以我們可以寫出狀態轉移方程
四、乙個遞迴基
考慮兩個序列第乙個元素和空鹼基的配對問題
for(int i=1;i<=la;i++)
for(int i=1;i<=lb;i++)
//下標從0開始
#include #include #include #include #include using namespace std;
int n, m, p = 0;
string a, b;
int dp[205][205];
int main() ;
int num[200];
string str = "acgt-";
for (int i = 0; i < 5; i++)
cin >> n >> a >> m >> b;
for (int i = 0; i < n; i++)
} for (int i = 0; i < n; i++)
for (int i = 0; i < m; i++)
for (int i = 0; i < n; i++)
} cout << dp[n][m];
return 0;
}
洛谷1140 相似基因
洛谷1140 相似基因 題目背景 大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。題目描述 ...
洛谷1140相似基因
兩個基因的相似度的計算方法如下 對於兩個已知基因,例如agtgatg和gttag,將它們的鹼基互相對應。當然,中間可以加入一些空鹼基 例如 這樣,兩個基因之間的相似度就可以用鹼基之間相似度的總和來描述,鹼基之間的相似度如下表所示 那麼相似度就是 3 5 5 2 3 5 3 5 9。因為兩個基因的對應...
P1140 相似基因
大家都知道,基因可以看作乙個鹼基對序列。它包含了4種核苷酸,簡記作a,c,g,t。生物學家正致力於尋找人類基因的功能,以利用於診斷疾病和發明藥物。在乙個人類基因工作組的任務中,生物學家研究的是 兩個基因的相似程度。因為這個研究對疾病的 有著非同尋常的作用。兩個基因的相似度的計算方法如下 對於兩個已知...