uva 11795 状压dp

来源:互联网 发布:oracle sql优化 编辑:程序博客网 时间:2024/05/01 08:10
UVA 11795 - Mega Man's Mission

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;}


0 0
原创粉丝点击