首先一眼感受到這題特別的性質……5個?這麼小的,感覺就像是狀壓。腦補了一下,如果沒有環的話應該很好做吧……有環怎麼辦?5真的很小的,隨便亂搞肯定也可以。那就放在外面暴力列舉吧。然後正解就出來了。
然而這題題面真的有毒吧。說好的不能全部選走?我還多加了乙個維度,結果資料裡面允許全部取走……然後對於<5的點單獨寫了個爆搜。**奇長……大家看看就好吧(以及位運算本人一貫以來又清奇又暴力的腦迴路……)
dp[0/1],1代表已經保留了至少乙個動物……如果要a掉此題的話把轉移那裡加上dp[0]的就好了。整個namespace speacial都是特判的點……(雖然資料裡面並沒有)
#include usingnamespace
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 ...