UVA11795 Mega Man'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<<MAXN];
int vis[1<<MAXN];
void solve(){
    for(int i=0;i<MAXN;i++) G[i].clear();
    memset(f,0,sizeof(f));
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    for(int i=0;i<=n;i++){
        char ch[10]={0};
        scanf("%s",ch+1);
        for(int j=1;j<=n;j++){
            if(ch[j]-48){
                G[i].push_back(j);
            }
        }
    }
    queue<int> q;
    f[(1<<n)-1]=1;
    vis[(1<<n)-1]=1;
    q.push((1<<n)-1);
    while(!q.empty()){
        int S=q.front();q.pop();
        int b[MAXN]={0};
        for(int i=0;i<G[0].size();i++){
            b[G[0][i]]=1;
        }
        int t=S,cnt=1;
        for(int i=0;i<n;i++){
            if(~(S>>i)&1){
                for(int j=0;j<G[i+1].size();j++){
                    b[G[i+1][j]]=1;
                }
            }
        }
        for(int i=0;i<n;i++){
            if(((S>>i)&1)&&b[i+1]){
                int dS=S^(1<<i);
                f[dS]+=f[S];
                if(!vis[dS]){
                    vis[dS]=1;
                    q.push(dS);
                }
            }
        }
    }
    printf("%lld\n",f[0]);
}
int main()
{
//    freopen("data.in","r",stdin);
//    freopen("my.out","w",stdout);
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        printf("Case %d: ",i);
        solve();
    }
    return 0;
}

UVA11795 Mega Man's Mission

时间: 2024-10-09 12:30:17

UVA11795 Mega Man's Mission的相关文章

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

题面 你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪.游戏初始你有一把武器,能杀死一些怪物.每次只能杀一只,求有多少种杀怪方法.n≤16 分析 f[i]的i的二进制表示每个怪物是否被杀死,f[i]的值表示目前这种状态的方案数.最后答案为f[(1<<n)-1]同时用s[i]表示状态为i的怪已经被杀了后得到的武器能杀死哪些怪.转移:如果这些怪在i状态时未被杀且i状态的武器能够杀死这个怪,就把这些怪杀了 代码 #include<bits/stdc++.h> us

UVA 11795 七 Mega Man&#39;s Mission

七 Mega Man's Mission Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11795 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 long long dp[65

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 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 状压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阶段训练1

最近又忙又颓.............时间抓不紧....下学期开始就要准备考研了.......就2个月左右可以做自己喜欢的事了....争取把紫书和白书没做的,做过的..来一次完整的总结 训练指南上面的5个例题+后面15个习题是第一阶段 vjudge训练地址 http://vjudge.net/contest/139533#overview -------------------------------------------------------------------------------

Mission Impossible 6

题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的部分功能,要求实现下面的操作功能: 1. 小写字母就是输入 2. L 表示光标左移,R 表示右移,如果超过了当前字符串的范围就忽略 3. S 表示在插入和覆盖之间的转换,如果在插入状态,就在光标右边插入一个字符,如果是覆盖状态,就覆盖右边的一个字符. 4. D 表示删除光标右边的一个字符 5. B

2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6

题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状链表)属于SGI STL的一部分,不属于ISO C++标准库,但libstdc++-v3也包含了扩展,在头文件#include<ext/rope>,using namespace __gnu_cxx命名空间中.可以在很短的时间内实现快速的插入.删除和查找字符串. rope.size()    返回