矩阵十题(10)
經(jīng)典題目10 POJ2778
????題目大意是,檢測所有可能的n位DNA串有多少個DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四個字符構(gòu)成。題目將給出10個以內(nèi)的病毒片段,每個片段長度不超過10。數(shù)據(jù)規(guī)模n<=2 000 000 000。
????下 面的講解中我們以ATC,AAA,GGC,CT這四個病毒片段為例,說明怎樣像上面的題一樣通過構(gòu)圖將問題轉(zhuǎn)化為例題8。我們找出所有病毒片段的前綴,把 n位DNA分為以下7類:以AT結(jié)尾、以AA結(jié)尾、以GG結(jié)尾、以?A結(jié)尾、以?G結(jié)尾、以?C結(jié)尾和以??結(jié)尾。其中問號表示“其它情況”,它可以是任 一字母,只要這個字母不會讓它所在的串成為某個病毒的前綴。顯然,這些分類是全集的一個劃分(交集為空,并集為全集)。現(xiàn)在,假如我們已經(jīng)知道了長度為 n-1的各類DNA中符合要求的DNA個數(shù),我們需要求出長度為n時各類DNA的個數(shù)。我們可以根據(jù)各類型間的轉(zhuǎn)移構(gòu)造一個邊上帶權(quán)的有向圖。例如,從 AT不能轉(zhuǎn)移到AA,從AT轉(zhuǎn)移到??有4種方法(后面加任一字母),從?A轉(zhuǎn)移到AA有1種方案(后面加個A),從?A轉(zhuǎn)移到??有2種方案(后面加G 或C),從GG到??有2種方案(后面加C將構(gòu)成病毒片段,不合法,只能加A和T)等等。這個圖的構(gòu)造過程類似于用有限狀態(tài)自動機做串匹配。然后,我們就 把這個圖轉(zhuǎn)化成矩陣,讓這個矩陣自乘n次即可。最后輸出的是從??狀態(tài)到所有其它狀態(tài)的路徑數(shù)總和。
????題目中的數(shù)據(jù)規(guī)模保證前綴數(shù)不超過100,一次矩陣乘法是三方的,一共要乘log(n)次。因此這題總的復(fù)雜度是100^3 * log(n),AC了。
以上轉(zhuǎn)載自Matrix67 blog
ps:再次orz? Matrix67大神
百度了下這一題的解法,說是AC自動機+矩陣冪乘
弱菜表示不會AC自動機,以前看過一點皮毛,但是現(xiàn)在全忘光了,等以后學(xué)習(xí)了,AC之后再附上代碼,這里先貼上Matrix67 大神的解法。
轉(zhuǎn)載于:https://www.cnblogs.com/frog112111/archive/2013/05/22/3093757.html
總結(jié)
- 上一篇: linux命令-- 抓包
- 下一篇: Word2013中怎样设置同一文档内粘贴