APIO2007 動物園 題解

2022-06-26 08:24:08 字數 2185 閱讀 5336

x### 原題鏈結

有一圈圍欄,每個圍欄有一種動物,有若干個小朋友,每個小朋友能看到連續的 \(5\) 個動物,每個小朋友對每種的動物的喜好不一樣,如果乙個小朋友會高興,當且僅當至少有乙個他害怕的動物被移走,或者是至少有乙個他喜歡的動物沒有被移走。問調整某些動物後,最多有多少個小朋友會高興。

題目的目的是移走若干動物,使得所有的小朋友中,高興的人數最多。其中問題的關鍵點在於如果確定了乙個位置的小朋友所能看到的 \(5\) 個位置的動物的移動狀態確定後,那麼在他旁邊的小朋友(如果存在)能看到的動物中有 \(4\) 個的狀態也就是確定了,而且兩者之間只有一位的狀態可以選擇,而且對應的只有移動和不移動兩種狀態。同時每種狀態只有 \(5\) 位組成,因此可以考慮狀壓dp搞一下。

有個小細節需要注意,就是題目的中給出的小朋友位於他看到的 \(5\) 個位置的中間,而資料的輸入格式給出的是他能看到的第乙個位置編號x,因此我們可以統一一下,就認為能看到位置編號為 \(\\) 的小朋友位於 \(x\)。這樣是不會影響答案的(因為小朋友所能看到的範圍是不變的,只是站位不一樣,當移動狀態確定後,高興的總人數是不變的)。

定義狀態,設 \(f[i][j]\) 表示從 \(1\) 到 \(i\),位置 \(i\) 的小朋友能看到的動物的移動狀態為 \(j\) 時,高興人數的最大值,我們用 \(1\) 表示移動該動物,\(0\) 表示不移動。

考慮轉移方程,先看下面的,其中 \(x\) 表示 \(0\) 或 \(1\):

當位置 \(i\) 的小朋友對應的動物移動狀態為 \(j\) 時,那麼與位置 \(i-1\) 的小朋友看到的動物移動狀態 \(j'\) 會有 \(4\) 位是重合的狀態,因此 \(j\) 可以由上乙個階段的 \(2\) 個狀態轉移過來,分別對應的是j&15<<1j&15<<1|1,即取 \(j\) 的低四位作為 \(j'\) 高四位,\(j'\) 的最低位是 \(0\) 或 \(1\)。兩者取 max 之後,還要加上位置 \(i\) 開始的連續 \(5\) 個位置的動物移動狀態為 \(j\) 的時候,高興的小朋友的人數。所以轉移方程為:$$f[i][j]=\max(f[i-1][(j&15)<<1],f[i-1][(j&15)<<1|1])+cnt[i][j]$$

這裡注意運算子的優先順序問題。

// 記錄每個小朋友害怕和喜歡的動物的狀態

int fear = 0, like = 0;

for (int j = 0; j < f; ++j)

// like也是一樣的操作

// 處理起點e的區間移動狀態對應的高興的小朋友的數量

for (int j = 0; j < 32; ++j)

}

到這裡我們基本可以補全**了:

for (int i = 1; i <= lan; ++i) 

}

然後找到 \(f[n][...]\) 當中的最大值?

提交上去會有紅色的 wa

問題在於這是乙個環,那麼就必須要考慮到收尾相連的情況,也就是收尾重合的部分的動物移動狀態也必須是相同的才行。

見下圖:

所有動物的移動狀態確定後,我們必須保證選取的 \(f[n][...]\) 中的答案對應的狀態 \(j\) 必須與 \(1\) 確定的狀態中陰影部分是相同的,也就是說我們必須要保證最後的答案是從開始 \(1\) 階段,對應的狀態為陰影部分加上 \(0\) 或 \(1\) 而來。那要怎麼保證呢?

我們可以列舉開始的狀態,可以規定乙個 \(0\) 階段,列舉每個起始的狀態 \(s\),初始化 \(f[0][s]=0\),其他值都初始化為絕對值大於總人數的負數(即負無窮),這樣可以保證最終的答案必然會從我們的初始狀態轉移過來。那麼針對這個起始狀態 \(s\),我們的答案對應的是 \(f[n][s]\),只有這乙個是可取的,只有這樣才能保證我們的環形的客觀條件。

補全**:

int ans = 0;

for (int s = 0; s < 32; ++s)

} ans = max(ans, f[lan][s]);

}

題解 APIO2007 動物園

傳送門 對於這個題目很明顯的就是狀壓dp,不過,作為乙個不會狀壓dp的蒟蒻,考場讓只能根據大佬們的之前聊天和對狀壓dp的印象來瞎搞 狀態是這樣設計的 f i,j 表示轉移到從第i個位置出發的j表示五個的動物的狀態能使多少個小朋友滿意 s i,j 表示從i出發的5個位置中表示j的狀態使多少個小朋友滿意...

題解 APIO2007動物園

首先一眼感受到這題特別的性質 5個?這麼小的,感覺就像是狀壓。腦補了一下,如果沒有環的話應該很好做吧 有環怎麼辦?5真的很小的,隨便亂搞肯定也可以。那就放在外面暴力列舉吧。然後正解就出來了。然而這題題面真的有毒吧。說好的不能全部選走?我還多加了乙個維度,結果資料裡面允許全部取走 然後對於 5的點單獨...

APIO2007 動物園 狀壓DP

表示調這題調到失智了,調了好久發現是因為dp的方向反了。首先我們觀察到雖然動物和小朋友數量都很多,但是每個小朋友可以看到的動物只有連續的5個!因此我們考慮狀壓,2 5還是可以承受的。再觀察到因為是連續的5個,所以對於任意一段以i為開頭的區間而言,區間都是已經被固定了的。因此對於每個區間單獨考慮。f ...