UVA 11795-Mega Man’s Mission(状态压缩DP)

题目大意:有N(1<=N<=16)种怪物,每种需要拥有能消灭它的一种或几种武器才能消灭,初始时有初始武器,消灭一种怪物会获得一些武器,问消灭完全部怪物的顺序有多少种。

用d[S]表示消灭状态为S(二进制)的怪物有多少种顺序,用c[S]表示消灭完S之后的武器。d[S]通过枚举最后消灭的是哪一个怪物来递推,前提是消灭除了它之外的怪物以后拿到的所有武器能消灭它。

c[S]通过取最低位来计算,即c[S]=c[S&-S]|c[S-(S&-S)]。

#include<stdio.h>
#include<stdlib.h>
typedef long long LL;
char a[30];
int c[77000];
LL d[77000];
int main(void)
{
	int i,j,u,p,n,pi,qi;
	LL sump;
	scanf("%d",&pi);
	for(qi=1;qi<=pi;qi++)
	{
		scanf("%d",&n);
		c[0]=0;
		for(i=0;i<=n;i++)
		{
			scanf("%s",a+1);
			u=0;
			for(j=n;j>=1;j--)
			{
				u=u*2+a[j]-'0';
			}
			c[(1<<i)/2]=(u|c[0]);
		}
		p=(1<<n);
		d[0]=1;
		for(i=1;i<p;i++)
		{
			if((i&-i)!=i)
			{
				c[i]=(c[i&-i]|c[i-(i&-i)]);
			}
			sump=0;
			for(j=1;j<=n;j++)
			{
				u=(1<<(j-1));
				if(((i&u)!=0)&&((c[i-u]&u)!=0))
				{
					sump=sump+d[i-u];
				}
			}
			d[i]=sump;
		}
		printf("Case %d: %lld\n",qi,d[p-1]);
	}
	return 0;
}
时间: 2024-10-28 21:51:15

UVA 11795-Mega Man’s Mission(状态压缩DP)的相关文章

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.这个很好理解,因为杀死 //

UVa11795 Mega Man&#39;s Mission(状态压缩DP)

Mega Man's Mission Mega Man is off to save theworld again. His objective is to kill the Robots created by Dr.Wily whose motive is to conquer the world. In each mission, he willtry to destroy a particular Robot. Initially, Mega Man is equippedwith a w

状压DP UVA 11795 Mega Man&#39;s Mission

题目传送门 1 /* 2 题意:洛克人有武器可以消灭机器人,还可以从被摧毁的机器人手里得到武器,问消灭全部机器人的顺序总数 3 状态压缩DP:看到数据只有16,就应该想到状压(并没有).因为是照解题报告写的,代码里加点注释,省的以后忘记了 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :2015-8-8 10:41:28 8 * File Nam

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

uva 11825 ,Hacker&#39;s Crackdown 状态压缩 dp

// uva 11825 Hacker's Crackdown // // 题目意思看了很久才看懂,有n台计算机,有n种服务,每台计算机上运行所有 // 的服务,并且其中有的计算机与某些计算机相互邻接,对于每台计算机, // 你可以选择一项服务,停止这项服务,则与它邻接的计算机的该服务也停止了 // 你的目的是让经量多的服务完全瘫痪 // // 换而言之,这个问题就是在n个集合中(p[1]....p[n])分成尽量多的组数,使得每组 // 的并集等于全集(即所有的n台电脑都停止)... // /

UVa 11825 黑客的攻击(状态压缩dp)

https://vjudge.net/problem/UVA-11825 题意: 假设你是一个黑客,侵入了一个有着n台计算机(编号为0,1,...,n-1)的网络.一共有n种服务,每台计算机都运行着所有服务.对于每台计算机,你都可以选择一项服务,终止这台计算机和所有与它相邻计算机的该项服务.你的目标是让尽量多的服务完全瘫痪. 思路: 数学模型:把n个集合P1,P2,P3...Pn分成尽量多组,使得每组中所有集合的并集等于全集. 因为只要每一组是全集,我们就可以破坏一个服务,分组越多,破坏的服务当

uva 11795(状态压缩dp)

题意:有一个机器人要杀死其他n(1 <= n <= 16)个机器人,他自己配备了一个武器,并且给出了这个武器能杀死的敌人,如101表示他能杀死第1和第3个敌人,这样他就能得到第1和第3号敌人的武器,从而杀死更多的敌人,问他杀死所有的敌人的方法数. 题解:因为敌人数最多是16个,很容易想到应该是状态压缩dp,可以用f[S]表示状态S下进制位为1的敌人全被杀死的方案数,那么结果就是f[(1 << n) - 1],如果拿掉了状态S中的杀死第j个人能得到的武器,剩下的人如果能杀死第j个人,

UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

题目链接:uva 1252 题意: 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1. 问最少提问次数,可以把所有字符串区分开来. 思路来源于:点击打开链接 思路: m很小,可以考虑状态压缩. dp[s1][s2]表示询问的状态为s1时,此时能猜到状态包含s2时最小需要的步数. 当询问的几位=s2的二进制串小于2时就能区分出来了,dp[s1][s2]=0: 不能区分则再询问一次,s1|=(1<<k),如果问某位为0,则s2不变,问某位为

UVA 11825 - Hackers&amp;#39; Crackdown 状态压缩 dp 枚举子集

UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集 ACM 题目地址:11825 - Hackers' Crackdown 题意: 有一个由编号0~n-1的n台计算机组成的网络,一共同拥有n种服务,每台计算机上都执行着所有服务,对于每台计算机,你能够选择停止一项服务,这个行为会导致与这台计算机和与他相连的其它计算机上的这项服务都停止(原来已经停止的继续保持停止状态). 求最多能使多少个服务瘫痪(即没有不论什么一台计算机在执行这项服务). 分析: 题目说白了.就

uva 11825 Hackers&#39; Crackdown(状态压缩DP)

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 wi