AHOI2006 bzoj1264 基因匹配

2021-07-29 01:52:00 字數 1291 閱讀 1019

description 基因匹配(match)

卡卡昨天晚上做夢夢見他和可可來到了另外乙個星球,這個星球上生物的dna序列由無數種鹼基排列而成(地球上只有4種),而更奇怪的是,組成dna序列的每一種鹼基在該序列中正好出現5次!這樣如果乙個dna序列有n種不同的鹼基構成,那麼它的長度一定是5n。

卡卡醒來後向可可敘述了這個奇怪的夢,而可可這些日子正在研究生物資訊學中的基因匹配問題,於是他決定為這個奇怪星球上的生物寫乙個簡單的dna匹配程式。

為了描述基因匹配的原理,我們需要先定義子串行的概念:若從乙個dna序列(字串)s中任意抽取一些鹼基(字元),將它們仍按在s中的順序排列成乙個新串u,則稱u是s的乙個子串行。對於兩個dna序列s1和s2,如果存在乙個序列u同時成為s1和s2的子串行,則稱u是s1和s2的公共子串行。

卡卡已知兩個dna序列s1和s2,求s1和s2的最大匹配就是指s1和s2最長公共子串行的長度。 [任務] 編寫乙個程式: 

從輸入檔案中讀入兩個等長的dna序列;  計算它們的最大匹配;  向輸出檔案列印你得到的結果。 input

輸入檔案中第一行有乙個整數n,表示這個星球上某種生物使用了n種不同的鹼基,以後將它們編號為1…n的整數。

以下還有兩行,每行描述乙個dna序列:包含5n個1…n的整數,且每乙個整數在對應的序列中正好出現5次。 output

輸出檔案中只有乙個整數,即兩個dna序列的最大匹配數目。

裸的lcs用dp是o(

n2) 的。

利用dp矩陣逐行考慮,注意到每個數隻會出現五次,每一行匹配的位置是常數級別的,而只有這些位置可以更新答案。因此只需要對這些點進行處理。需要的操作就是詢問字首最大值,用樹狀陣列維護,複雜度o(

nlogn)

#include

#include

#include

using

namespace

std;

int rd()

return x;

}int n,f[20010][5],now[20010],a[100010],mx[100010];

int qry(int p)

void upd(int p,int x)

int main()

for (int i=1;i<=n*5;i++)

for (int j=5;j;j--)

upd(f[a[i]][j],qry(f[a[i]][j]-1)+1);

printf("%d\n",qry(n*5));

}

1266 AHOI2006 上學路線route

題目鏈結 題目大意 給出乙個無向圖,每條邊有長度和代價。求出1到n的最短路。刪掉一些邊使得1到n的最短路變大並使得刪掉邊的代價之和最小。題解 跑出最短路樹,然後求最短路樹上的最小割 我的收穫 按照3931改了幾行就過了 include include include include include ...

超級鋼琴 BZOJ 2006

超級鋼琴 問題描述 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級 和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們...

bzoj 3875 Ahoi2014 騎士遊戲

故事背景 長期的宅男生活中,jyy又挖掘出了一款rpg遊戲。在這個遊戲中jyy會 扮演乙個英勇的騎士,用他手中的長劍去殺死入侵村莊的怪獸。問題描述 在這個遊戲中,jyy一共有兩種攻擊方式,一種是普通攻擊,一種是法術攻 擊。兩種攻擊方式都會消耗jyy一些體力。採用普通攻擊進攻怪獸並不能把怪獸徹底殺死,...