題解 APIO2007動物園

2022-02-27 13:31:41 字數 1518 閱讀 3221

首先一眼感受到這題特別的性質……5個?這麼小的,感覺就像是狀壓。腦補了一下,如果沒有環的話應該很好做吧……有環怎麼辦?5真的很小的,隨便亂搞肯定也可以。那就放在外面暴力列舉吧。然後正解就出來了。

然而這題題面真的有毒吧。說好的不能全部選走?我還多加了乙個維度,結果資料裡面允許全部取走……然後對於<5的點單獨寫了個爆搜。**奇長……大家看看就好吧(以及位運算本人一貫以來又清奇又暴力的腦迴路……)

dp[0/1],1代表已經保留了至少乙個動物……如果要a掉此題的話把轉移那裡加上dp[0]的就好了。整個namespace speacial都是特判的點……(雖然資料裡面並沒有)

#include using

namespace

std;

#define cnst 32

#define maxn 10300

int n, c, tot, fans = 0, dp[maxn][cnst][2

];int num1[maxn * 5], num2[maxn * 5

];int lst[6] = ;

int fst[6] = ;

vector

v[maxn];

intread()

void gmax(int &a, int

b)void print(int

x)

for(int i = 5; i; i --)

printf("%d

", a[i]);

return;}

void work(int x, int sum, int

opt)

dp[x][sum][opt] +=tem;

int k1 = (sum << 1) & (fst[4]), k2 = (((sum << 1) & (fst[4])) | 1

); gmax(dp[x + 1

][k1][opt], dp[x][sum][opt]);

gmax(dp[x + 1][k2][1

], dp[x][sum][opt]);

}int check(int now, int

sum)

}return

ans;

}int dp(int sum, int

opt)

}

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

return

ans;

}void dfs(int x, int

sum)

sum

<<= 1

; dfs(x + 1

, sum);

dfs(x + 1, sum |= 1);}

intmain()

for(int j = 1; j <= l; j ++) //

喜歡 }

dfs(

1, 0

); printf(

"%d\n

", fans);

return0;

}

題解 APIO2007 動物園

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

APIO2007 動物園 題解

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

APIO2007 動物園 狀壓DP

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