码迷,mamicode.com
首页 > 其他好文 > 详细

uva

时间:2014-10-28 19:28:34      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

这题说的是一个人要消灭 所有的机器人,但是他有他可以消灭的机器人,他可以通过它消灭的机器人的武器去消灭其他的机器人, 给了一个可以消灭的关系的矩阵,计算消灭这些机器人的顺序的不同方案是多少种 , 刚开始以为是方案数 而不是 消灭的顺序wa

我们可以知道dp[S] 这个集合的状态可以从 他的子集来, 枚举他的子集,这样可以从不同的子集来,这样我们每个点子被算一次

首先 要处理每个子集所能 到达的点的情况列举出来 , 进行预处理,得到答案

bubuko.com,布布扣
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn=20;
int mto[maxn];
ll dp[1<<16];
char s1[maxn];
int P[1<<16];
int main(){
    int cas;
    scanf("%d",&cas);
    for(int cc=1; cc<=cas; ++cc){
          int n;
          scanf("%d",&n);
          for(int i=0; i<=n ; ++i){
               scanf("%s",s1);
               mto[i]=0;
               for(int j=0; j<n; ++j)
                     if(s1[j]==1)
                        mto[i]|=(1<<j);
          }
          for(int S=0;S<(1<<n) ;++S){
               P[S]=mto[0];
               for(int i=0; i<n; ++i)
                 if(S&(1<<i))
                    P[S]=P[S]|mto[i+1];
          }
          memset(dp,0,sizeof(dp));
          dp[0]=1;
          for(int S=0; S<(1<<n); ++S){
               for(int i=0; i<n; ++i)
               if( ( S&(1<<i) ) &&( P[S^(1<<i)]&(1<<i) ) ){
                   dp[S]+= dp[S^(1<<i)];
               }
          }
          printf("Case %d: %lld\n",cc,dp[(1<<n)-1]);

    }

    return 0;
}
View Code

 

uva

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/Opaser/p/4057329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!