【UVA11795】 Mega Man's Mission

题面

你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪。游戏初始你有一把武器,能杀死一些怪物。每次只能杀一只,求有多少种杀怪方法。n≤16

分析

f[i]的i的二进制表示每个怪物是否被杀死,f[i]的值表示目前这种状态的方案数。最后答案为f[(1<<n)-1]
同时用s[i]表示状态为i的怪已经被杀了后得到的武器能杀死哪些怪。
转移:如果这些怪在i状态时未被杀且i状态的武器能够杀死这个怪,就把这些怪杀了

代码

#include<bits/stdc++.h>
using namespace std;
#define N 18
#define ll long long
int t,n,mx,cas;
int k[1<<N],s[1<<N];
ll f[1<<N];
char c[N];
inline void init()
{
    mx=(1<<n)-1;cas++;
    memset(s,0,sizeof(s));
    memset(f,0,sizeof(f));
    memset(k,0,sizeof(k));
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%s",&n,c);
        init();
        for(int i=0;i<strlen(c);i++)
            if(c[i]==‘1‘)
                s[0]|=(1<<i);
        for(int i=0;i<n;i++)
        {
            scanf("%s",c);
            for(int j=0;j<strlen(c);j++)
                if(c[j]==‘1‘)
                    k[i]|=(1<<j);
        }
        for(int i=0;i<=mx;i++)
        {
            s[i]=s[0];
            for(int j=0;j<n;j++)
                if(i&(1<<j))
                    s[i]|=k[j];
        }
        f[0]=1;
        for(int i=0;i<=mx;i++)
        {
            if(!f[i])continue;
            for(int j=0;j<=n;j++)
                if(((i&(1<<j))==0)&&((s[i]&(1<<j))!=0))
                    f[i|(1<<j)]+=f[i];
        }
        printf("Case %d: %lld\n",cas,f[mx]);
    }
}

【UVA11795】 Mega Man's Mission

原文地址:https://www.cnblogs.com/NSD-email0820/p/9795808.html

时间: 2024-10-30 22:29:14

【UVA11795】 Mega Man's Mission的相关文章

【最短路】ACdream 1198 - Transformers&#39; Mission

Problem Description A group of transformers whose leader is Optimus Prime(擎天柱) were assigned a mission: to destroy all Decepticon's(霸天虎) bases. The bases are connected by roads. They must visit each base and place a bomb there. They start their missi

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

UVA11795 Mega Man&#39;s Mission

状压dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define MAXN 20 #define ll long long using namespace std; int n; vector<int> G[MAXN]; ll f[1<<MA

【POJ】2449 Remmarguts&#39; Date(k短路)

http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k 首先我们建反向边,跑一次从汇到源的最短路,将跑出来的最短路作为估价函数h 根据f=g+h 我们将源s先走,此时实际价值g为0,估价为最短路(他们的和就是s-t的最短路) 将所有s所连的边都做相同的处理,加入到堆中(假设此时到达的点为x,那么x的g等于s到这个点的边权,因为根据最优,g+h此时是从x

SCI&amp;EI 英文PAPER投稿经验【转】

英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求把论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而且说了很多难听的话,说投稿前首先就应该看清楚他们的格式要求:2. 论文写作一定要言简意赅,特别是摘要,引言和结论部分,特别

POJ3249 Test for Job 【DAG】+【记忆化搜索】

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9201   Accepted: 2080 Description Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job

【POJ】【2449】Remmarguts&#39; Date

K短路/A* 经(luo)典(ti) K短路题目= = K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html 流程: 先把所有边逆向,做一遍dijkstra,得到估价函数h(x)(x到T的最短路距离) f(x)=g(x)+h(x) 按f(x)维护一个堆……T第k次出堆时的g(T)即为ans 另外,需要特判:如果S==T,k++ 1 Source Code 2 Problem: 2449 User: sdfzyhy 3 Memory: 11260K T

POJ 2449 Remmarguts&#39; Date【SPFA】【A*】

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 21978 Accepted: 5982 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he to

【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变量. 2.1 创建新转换:spoon启动后,点击Ctrl+N创建新转换 2.2 在新转换界面中,右键点击DB连接,系统会弹出[数据库连接]界面. windows系统环境下,可用${}获取变量的内容. 说明: 连接名称:配置数据源使用名称.(必填) 主机名称:数据库主机IP地址,此处演示使用本地IP(