0 GP
爆肝啦!USACO 4-1 cryptcow 乳牛加密
作者:willyliu│2010-02-05 05:15:06│巴幣:0│人氣:380
這一題真的很噁心啊~
一直剪枝,程式碼根本就一大坨。
題目:有一種加密方式是說,把一個字串按照順序隨機插入’C’ ‘O’ ‘W’三個字元,並將 CO 以
及 OW 之間的子字串互換之後產生一個新的加密字串,現在給你一個經過重複加密過的字串,請問他有
沒有可能是 Begin the Escape execution at the Break of Dawn 經過加密而成。(題目敘述翻譯來自建中講義)
剪枝剪到一百五十五行,將上main有6個函式,太恐怖了,剪枝地獄。
我的解法:
0.由輸入得到序字串S,目標字串為T
1.找S出所有(C, O, W)序列
2.對於每一個數對(C, O, W),進行3~5
3.交換區間(C, O)及區間(O, W),把'C', 'O', 'W'標號讓他們消失
4.回到1,遞迴
5.把原二區間換回,把'C', 'O', 'W'標記還原
6.搜完一層,若有找到解,會傳True,否則為False
Theorem:
(1).如果S之某子字串S'中沒有C, O, W,那麼S'已不能改變(雖然可能被移動),所以T中必須出現S'
(2).S的第一個關鍵字(意指C或O或W)必須為C,最後一個必須為W,才能進行有效的操作
(3).S[0]到第一個關鍵字的prefix、最後一個關鍵字到結尾的suffix,必須和T的完全相同。因為prefix和suffix已不可能被改變或被移動
(4).第一個關鍵字必在上一層遞迴出現的第一個關鍵字之後;最後一個必須在上一層的之前。因為(3)
所以利用Theorem來快樂地剪枝
做到這裡,應該可以在3, 4秒內跑完所有測資。
可惜,他要求在2秒內通過,於是在第9筆時爆掉了!
看數字應該可以知道,這是常數問題,應該無法再剪枝了,所以我們要努力壓常數。
因為要進行整段文字的操作,每一次改變的操作是O(n),因此我們使用Linked List,讓它變成O(1)
然後,你會看到成功就在眼前了。
所以,本人使用隨機亂剪法,跟他拼人品,一傳就AC了。
看完USACO Analysis後才發現,原來還還可以再剪= ="
引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=249564
All rights reserved. 版權所有,保留一切權利