状压DP UVA 11795 Mega Man's Mission

题目传送门

 1 /*
 2     题意:洛克人有武器可以消灭机器人,还可以从被摧毁的机器人手里得到武器,问消灭全部机器人的顺序总数
 3     状态压缩DP:看到数据只有16,就应该想到状压(并没有)。因为是照解题报告写的,代码里加点注释,省的以后忘记了
 4 */
 5 /************************************************
 6 * Author        :Running_Time
 7 * Created Time  :2015-8-8 10:41:28
 8 * File Name     :UVA_11759.cpp
 9  ************************************************/
10
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29
30 #define lson l, mid, rt << 1
31 #define rson mid + 1, r, rt << 1 | 1
32 typedef long long ll;
33 const int MAXN = 20;
34 const int INF = 0x3f3f3f3f;
35 const int MOD = 1e9 + 7;
36 ll dp[(1<<16)+10];
37 int w[MAXN];
38 int s[(1<<16)+10];
39 char mega[MAXN];
40 char robot[MAXN];
41 int n;
42
43 int main(void)    {     //UVA 11795 Mega Man‘s Mission
44     int T, cas = 0;  scanf ("%d", &T);
45     while (T--) {
46         scanf ("%d", &n);
47         scanf ("%s", mega);
48
49         memset (w, 0, sizeof (w));
50         for (int i=0; i<n; ++i)    {
51             scanf ("%s", robot);
52             for (int j=0; j<n; ++j) {
53                 if (robot[j] == ‘1‘)   {
54                     w[i] |= (1 << j);           //求出每个机器人拥有的武器,用二进制累加
55                 }
56             }
57         }
58
59         memset (s, 0, sizeof (s));
60         for (int i=0; i<n; ++i) {
61             if (mega[i] == ‘1‘) {
62                 s[0] |= (1 << i);               //求出洛克人手里的武器
63             }
64         }
65         for (int i=1; i<(1<<n); ++i)    {       //i表示机器人死亡的情况,例如00000表示一个都没消灭,11111表示全部消灭
66             s[i] = s[0];
67             for (int j=0; j<n; ++j) {
68                 if (i & (1 << j))   {           //意思是当前第j个机器人被消灭
69                     s[i] |= w[j];               //那么能得到它的武器
70                 }
71             }
72         }
73
74         memset (dp, 0, sizeof (dp));    dp[0] = 1;      //一个都没被消灭的方案数为1
75         for (int i=0; i<(1<<n); ++i)    {
76             if (!dp[i]) continue;
77             for (int j=0; j<n; ++j) {
78                 if ((s[i] & (1 << j)) && (i & (1 << j)) == 0)   {       //意思是当前有武器能消灭第j个机器人并且要消灭它
79                     dp[i|(1<<j)] += dp[i];                              //累加到消灭之后的状态里
80                 }
81             }
82         }
83         printf ("Case %d: %lld\n", ++cas, dp[(1<<n)-1]);        //111111全部都被消灭的方案数
84     }
85
86     return 0;
87 }

状压DP UVA 11795 Mega Man's Mission

时间: 2024-10-29 19:10:35

状压DP UVA 11795 Mega Man's Mission的相关文章

uva 11795 Mega Man&#39;s Mission 状压dp

// uva 11795 Mega Man's Mission 状压dp // 设r[i]表示第i个机器人所拥有的武器的数目 // r[0]表示初始时洛克人所拥有的武器数 // w[s]表示杀死集合s中的机器人后所得的武器数 // d[s]表示能杀死集合s中的机器人的顺序总数 // d[s] = sigma(d[s-{i}]) 其中i是集合s中的机器人 // 还有一点就是w[S-{i}]的武器可以杀死i. // 注意: // 1)初始的时候d[0]=1,其他均为0.这个很好理解,因为杀死 //

状压DP UVA 10817 Headmaster&#39;s Headache

题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s1二进制表示下至少有1位老师的科目集合 4 s2表示至少有2位老师的科目集合所花费的最小金额,状态转移方程(01):dp[t1][t2]=min(dp[t1][t2],dp[j][k]+c[i]); 5 j,k为当前两个集合,t1,t2为转移后的集合,另外求t1,t2用到了& |位运算

UVA - 11795 Mega Man&#39;s Mission

Mega Man is off to save the world again. His objective is to kill the Robots created by Dr. Wily whose motive is to conquer the world. In each mission, he will try to destroy a particular Robot. Initially, Mega Man is equipped with a weapon, called t

状压DP [Uva 11825] Hackers’ Crackdown

Hackers’ Crackdown  Input: Standard Input Output: Standard Output   Miracle Corporations has a number of system services running in a distributed computer system which is a prime target for hackers. The system is basically a set of N computer nodes w

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

UVA 10817 Headmaster&#39;s Headache 状压DP

记录两个状态S1,S2分别记录哪些课程被1个人教过或2个人教过,然后记忆化搜索 UVA - 10817 Headmaster's Headache Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spr

【UVa】Headmaster&#39;s Headache(状压dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1758 晕....状压没考虑循环方向然后错了好久.. 这点要注意...(其实就是01背包变成了完全背包QAQ 我们将课程拆成两个点,然后状压 那么答案就是(1<<(s<<1))-1 转移就不说了,,,,,太简单.. #include <cstdio> #in

uva 11825 Hackers&amp;#39; Crackdown (状压dp,子集枚举)

题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪(没有计算机有该项服务). 思路:(见大白70页,我的方程与大白不同) 把n个集合P1.P2.Pn分成尽量多的组,使得每组中全部集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中全部集合的并集,dp[s]表示子集s最多能够分成多少组,则 假设co

UVA - 10817 Headmaster&#39;s Headache (状压dp+记忆化搜索)

题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目. 2.已聘老师必须选,候选老师可选可不选. 3.dfs(cur, subject1, subject2)---求出在当前已选cur个老师,有一个老师教的科目状态为 subject1,有两个及以上老师教的科目状态为 subject2的情况下,最少的雇佣费用. dp[cur][subje