zoukankan      html  css  js  c++  java
  • 【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
    ",cas,f[mx]);
        }
    }
    “Make my parents proud,and impress the girl I like.”
  • 相关阅读:
    6-rocketmq-springboot整合
    5-rocketmq-事务消息
    3-rocketmq-支持的消息种类
    2-rocketmq-消息发送和接收
    1-rocketmq简介-部署
    详解unix5种IO模型
    大纲
    马哥博客作业第二十一周
    马哥博客作业第二十周
    马哥博客作业第十九周
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9795808.html
Copyright © 2011-2022 走看看