APIO2007 動物園 狀壓DP

2022-04-30 00:51:30 字數 2361 閱讀 3830

表示調這題調到失智了,,,調了好久發現是因為dp的方向反了。。。

首先我們觀察到雖然動物和小朋友數量都很多,但是每個小朋友可以看到的動物只有連續的5個

因此我們考慮狀壓,2^5還是可以承受的。

再觀察到因為是連續的5個,所以對於任意一段以i為開頭的區間而言,區間都是已經被固定了的。

因此對於每個區間單獨考慮。

f[i][j]表示以i為開頭的區間,狀態為j的最優解。

但是觀察到,由於判斷每個小朋友貢獻的條件相對複雜,而且要臨時處理不方便。

所以考慮預處理出任意以i為開頭的區間的任意狀態對應了幾個小朋友滿意

這裡在讀入每個小朋友的時候給對應區間每種狀態累加上他的貢獻即可

num[i][j]表示以i為開頭的區間,狀態為j時有多少個剛好看見這個區間的小朋友滿意

於是有轉移方程

now=j & 15;//j為當前狀態

f[i][j]=max(f[i-1][(now << 1) | 1],f[i-1][now << 1]) + num[i][j];

轉移方程怎麼推?

注意到因為每個區間的貢獻都是單獨統計的,所以每個區間是相對獨立的,但是仍然有限制,

懶得用各種編輯器其實是不會,還是手寫吧

原諒我巨醜無比的字

然後再來考慮環如何處理,

發現因為前幾位和後幾位涉及到區間跨越的問題,很不好處理,所以考慮暴力列舉前5位,

同時f[1][j]將不統計上乙個區間f[n][k]的答案(因為後面dp到那還會統計一次)

為了限制前幾位只能取列舉到的k,

首先memset(f[1],128,sizeof(f[1]));//初始化為極小值

1後面的不用修改,因為dp過程中會改的。

f[1][k]=num[1][k];

然後從2開始dp

處理到後面幾位的時候,又需要限制前幾位只能是列舉到的k,

那怎麼辦?

特判?其實有乙個更妙的方法

我們建立乙個虛擬區間n+1,這個區間由n轉移而來,也就是說實質上就是對應的f[1],

因此f[n+1][k]就表示前5個取了k,

於是在統計答案的時候比較ans , f[n+1][k]即可

同時注意一下開始預處理num的時候對環的處理

1 #include2

using

namespace

std;

3#define r register int

4#define ac 10010

5#define getchar() *o++

6char read[5000100],*o=read;

7int

n,m,like,fear,ans;

8int num[ac][35],f[ac][35],g[ac][35];9

/*num[i][j]表示從第i位開始,狀態為j的情況下,將會有幾個小朋友滿意(區間完全吻合的)

10f[i][j]表示從第i位開始,狀態為j,最多有幾個小朋友滿意(總共的)

11注意對環的處理?

12既然一開始就預處理出了所有狀態,,,那直接跑有何不可呢???

*/13 inline int

read()

1420

21void pre()//

in && getnum

2234

for(r j=1;j<=c;j++)//

get like

3539

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

40if(((j & fear) != fear) || (j & like)) num[a][j]++;41}

42}43//

我錯了qaq,,,,根本不需要這麼多特判,首先前幾個的特判完全可以用初始化來代替

44//

而後幾個的也不用,可以一直算到n+1,將n+1的狀態限定在k,從n轉移,這樣滿足條件了,不滿足的會被篩掉

4546

void work()//

getans

47 //

error!!!!這裡不要max(f[i][j],)因為f[i][j]本來就只要取一次,而且又沒有初始化!!!60}

61 ans=max(ans,f[n+1

][k]);62}

63 printf("

%d\n

",ans);64}

6566

intmain()

67

題解 APIO2007 動物園

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

題解 APIO2007動物園

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

APIO2007 動物園 題解

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