從我原來的部落格上搬運。原先blog作廢。
脫氧核糖核酸即常說的dna,是一類帶有遺傳資訊的生物大分子。它由4種主要的脫氧核苷酸(damp、dgmp、dcmt和dtmp)通過磷酸二酯鍵連線而成。這4種核苷酸可以分別記為:a、g、c、t。
dna攜帶的遺傳資訊可以用形如:aggtcgactcca…. 的串來表示。dna在轉錄複製的過程中可能會發生隨機的偏差,這才最終造就了生物的多樣性。
為了簡化問題,我們假設,dna在複製的時候可能出現的偏差是(理論上,對每個鹼基被複製時,都可能出現偏差):
漏掉某個脫氧核苷酸。例如把 aggt 複製成為:agt
錯碼,例如把 aggt 複製成了:agct
重碼,例如把 aggt 複製成了:aaggt
如果某dna串a,最少要經過 n 次出錯,才能變為dna串b,則稱這兩個dna串的距離為 n。
例如:aggtcatattcc 與 cggtcatattc 的距離為 2
你的任務是:編寫程式,找到兩個dna串的距離。
此題原型即最短編輯距離,用dp解決。
不妨設兩串分別為$str_a,str_b$,長度分別為$m,n$,設$dp[i][j]$為$a$串的長度為$i$的字首字串和$b$串的長度為$j$的字首子串,那麼原題即求$dp[m-1][n-1]$。
下面是轉移方程:
$$dp[i][j]=\left\
dp[i-1][j-1] & , & a[i]=b[j] \\
min\& , & a[i] \ne b[j]
\end
\right.
$$理解問題應當出現在第二個式子上。我們以b串為母串,那麼
一、二、三子式分別對應重複、刪除、修改這三種情況。
特別地,邊界條件:$dp[i][0]=i,dp[0][j]=j$。
為何呢?因為從i長度變為空串總要i次操作。
#include
using
namespace
std;
#define f1(x,y) for(int x=1;x<=y;++x)
#define f0(x,y) for(int x=0;x!=y;++x)
#define bf1(x,y,z) for(int x=y;x>=z;--x)
#define bf0(x,y,z) for(int x=y;x!=z;--x)
typedef
long
long ll;
typedef
unsigned
long
long ull;
int dp[10005][10005];
int main()
else
}else}}
cout
<1][blen-1]0;}
微生物增殖,藍橋杯2023年第1題
微生物增殖 假設有兩種微生物x和y,x出生後每隔 3分鐘 一次 數目加倍 y出生後每隔 2分鐘 一次 數目加倍 乙個新出生的 x,半分鐘之後吃掉1個 y,且從此開始每隔 1分鐘吃掉1個 y。已知新出生的 x 10 y 89 求60 分鐘後y 的數目。若 x 10 y 90呢?本題的要求就是寫出這兩種...
藍橋杯第4屆第10題
小明這些天一直在思考這樣乙個奇怪而有趣的問題 在1 n的某個全排列中有多少個連號區間呢?這裡所說的連號區間的定義是 如果區間 l,r 裡的所有元素 即此排列的第l個到第r個元素 遞增排序後能得到乙個長度為r l 1的 連續 數列,則稱這個區間連號區間。當n很小的時候,小明可以很快地算出答案,但是當n...
2016藍橋杯javaA組第4題
分小組9名運動員參加比賽,需要分3組進行預賽。有哪些分組的方案呢?我們標記運動員為 a,b,c,i 下面的程式列出了所有的分組方法。該程式的正常輸出為 abc def ghi abc deg fhi abc deh fgi abc dei fgh abc dfg ehi abc dfh egi ab...