UVA 11795 - Mega Man's Mission
Mega 要去解决n个机器人,每解决一个机器人可获得若干把武器。每个机器人只能被特定的武器解决。给出Mega 现有的武器,和解决i号机器人可以获得的武器,求Mega 完成任务的方案数。
状压dp
枚举当前已经解决的机器人状态s,根据s 我们可以得到Mega 现有武器状态k ,通过k 我们可以得出状态 s 再解决一个机器人后能到达的状态 _s。
Mega 要去解决n个机器人,每解决一个机器人可获得若干把武器。每个机器人只能被特定的武器解决。给出Mega 现有的武器,和解决i号机器人可以获得的武器,求Mega 完成任务的方案数。
状压dp
枚举当前已经解决的机器人状态s,根据s 我们可以得到Mega 现有武器状态k ,通过k 我们可以得出状态 s 再解决一个机器人后能到达的状态 _s。
dp[_s] += dp[s];
#include <bits/stdc++.h>
int N, S;
int r[17];
int dp[(1<<16)+5];
char tmp[20];
int _getRob(char tmp[]) {
int res = 0;
for (int i=0; i<N; i++) {
if (tmp[N-1-i] == '1') {
res |= (1 << i);
}
}
return res;
}
int _getKill(int s) {
int res = S;
for (int i=0; i<N; i++) {
if ((s & (1<<i)) != 0)
res |= r[i];
}
return res;
}
int main () {
int Tcase;
for (scanf("%d", &Tcase); Tcase>0; --Tcase) {
scanf ("%d%s", &N, &S);
for (int i=0; i<N; i++) {
scanf ("%s", tmp);
r[i] = _getRob(tmp);
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int s=0; s<(1<<N); s++) {
int k = _getKill(s);
for (int i=0; i<N; i++) {
if ((s & (1<<i)) == 0 && (k & (1<<i)) != 0) {
int _s = s | (1 << i);
dp[_s] += dp[s];
}
}
printf("%d\n", dp[(1<<N)-1]);
}
return 0;
}