1. 程式人生 > 其它 >洛谷P1879題解

洛谷P1879題解

題面

顯然是個狀壓DP。
看資料範圍,不難發現演算法複雜度應該是 \(O(n\times 2^n \times 2^n)\)
顯然第一個 \(n\) 是遍歷每一行的土地。 後面兩個 \(2^n\) ,想都不用想就知道是暴力列舉上一行和這一行的狀態。
而列舉狀態這個東西比較浪費時間,所以我們可以先不考慮土地是否肥沃,把每一行的可能分佈先做出來。
我們設這一行的狀態是 \(i\) ,那麼, \(i\) 中不能有相鄰的兩個 \(1\) 。可以這樣 ((i & (i << 1)) == 0) && ((i & (i >> 1)) == 0) 判斷。
然後我們要開一個數組記錄每一行那些位置能放。我們為方便,設 \(1\)

是能放 \(0\) 是不能放。那麼當我們列舉到一個狀態的時候,算一下 j & map[i] ,當 i & map[i] == j 時就說明 \(j\) 中每個 \(1\) 對應到 \(map_i\) 裡面都是 \(1\) ,那麼這個 \(j\) 就是成立的。
接下來我們要列舉上一行的狀態,然後判斷兩行中是否存在一個位置使得上下都被選上,那麼我們算一下 k & j 即可。如果他不等於零說明這個 \(k\)\(j\) 不能匹配。如果他等於零那就累加答案即可。
注:\(i\) 是行號 \(j\) 是當前行的狀態 \(k\) 是上一行的狀態。

程式碼