【AHOI2013複仇】從一道題來看DFS及其最佳化的一般步驟和數組分層問題【轉】

來源:互聯網
上載者:User

標籤:tle   不同的   .com   archive   分層   改變   調試技巧   矩形   引用   

http://www.cppblog.com/MatoNo1/archive/2012/09/23/191708.html

———————————————————————————————————————————————————

普通DFS(不加迭代)的最佳化方法主要有:
(1)可行性剪枝,如果遇到已經無法產生可行解的情況就剪枝,有時候,可行性剪枝也可以指在搜尋過程中對不合法情況的剔除;
(2)最優性剪枝:如果遇到已經無法產生比目前得到的最優解還要優的解的情況就剪枝,這其中包括啟發學習法最優性剪枝(即分支限界),對目前解的進展情況作樂觀估計,如果估計值都不能超越目前的最優解,則剪枝;
(3)通過改變搜尋順序,儘早得出較優解,從而為後面的剪枝提供餘地;
(4)通過預先處理等手段,提前得到啟發值或者較優解,為後面的剪枝提供餘地;

一般步驟:
(1)預先處理,當然是寫在最前面,在搜尋前得到啟發值等東東;
(2)搜尋過程中,先寫最優性剪枝(包括已經到達搜尋終點了,也應該判斷一下,提前排除不是最優解的情況);
(3)再判定搜尋終點,如果到了,也不要馬上更新解,而是要判定這個解是否符合要求,再更新;
(4)若未到終點,再寫可行性剪枝;
(5)最後寫搜尋過程,包括需要改變搜尋順序的情況。

注意事項:數組的分層問題。
這是一個很嚴重的問題,因為分層出錯很可能會導致一些很怪的錯誤出現,難以發現。在搜尋題的調試技巧這一篇中,已經提到了這個問題,本題又涉及到了。
一般來說,搜尋過程中使用的數組(包括變數,可以視為零維數組)可以分為以下三類:
(1)在搜尋過程中,只會引用其值,不會修改的數組(比如預先處理中得到的那些東東),相當於常量;
(2)在搜尋過程中,會改變其值,但在搜尋完畢後能改回原值的數組;
(3)在搜尋過程中,會改變其值,且在搜尋完畢後也改不回原值的數組。
對於(1)(2)類數組,不需分層,但對於第(3)類數組一定要分層。這是因為這些數組在多層搜尋中都需要修改,而且搜尋完了也改不回來,如果不分層,則當後面的搜尋完畢以後,要繼續搜尋前面的,引用的將是後面的值,就會出錯。
對於第(3)類數組,有的已經“自然分層”(每層搜尋修改的元素都不一樣),比如本題代碼中的R[][]、C[][]。然而有的並沒有自然分層,比如本題的len、pos[]、tmp[]等,因此對於這些數組,需要再加一維,對於不同層使用該維不同的元素即可。

下面是本題的演算法:
使用DFS搜尋每個位置的擋板是否需要放。搜尋時,先搜豎的再搜橫的,由於題目要求每個連通塊都必須是矩形,因此對於豎的,如果該位置的上方兩個相鄰位置的橫的沒有全放(包括只放了一個),則該位置的豎的放不放取決於其上一行對應位置的豎的有沒有放(第一行除外),如果兩個橫的都放了,則這裡的豎的既可以放也可以不放(先搜不放的情況)。當然,一行的兩個1之間必須至少有一個豎的,這是可行性限制。在搜橫的的時候,按照該行所放的豎的,分成若干段,顯然每一段要麼下面都用橫的封上,要麼一個都不封上。其中,如果該段所在的連通塊裡面有1,且下一行對應位置也有1,則必須封上;若該段所在連通塊裡面沒有1,則不能封上(因為不能有一個連通塊裡一個1都沒有),否則可以自由選擇封還是不封(當然也是先搜不封的)。這樣一直搜到最後一行的豎的後,還要判斷最後一行有沒有連通塊裡沒1,若沒有,則為一個可行解。啟發學習法最佳化:設D[i]為第i行及以後至少要幾個擋板(若某行有K個1,則至少需要(K-1)個豎的;若某列有K個1,則至少需要(K-1)個橫的,累加起來即可,顯然這是樂觀估計),D[i]可以預先處理出來,當做啟發值。

【AHOI2013複仇】從一道題來看DFS及其最佳化的一般步驟和數組分層問題【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.