zoukankan      html  css  js  c++  java
  • P2622 关灯问题II 状压dp

      

    题目描述

    现有n盏灯,以及m个按钮。每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是0,无论这灯是否开,都不管。

    现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。

    输入输出格式

    输入格式:

    前两行两个数,n m

    接下来m行,每行n个数,a[i][j]表示第i个开关对第j个灯的效果。

    输出格式:

    一个整数,表示最少按按钮次数。如果没有任何办法使其全部关闭,输出-1

    输入输出样例

    输入样例#1: 复制
    3
    2
    1 0 1
    -1 1 0
    输出样例#1: 复制
    2

    说明

    对于20%数据,输出无解可以得分。

    对于20%数据,n<=5

    对于20%数据,m<=20

    上面的数据点可能会重叠。

    对于100%数据 n<=10,m<=100

    状压dp入门题

    感觉更像是枚举bfs 而不是dp。。

    暴力即可   

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define lson l,m,pos<<1
    #define rson m+1,r,pos<<1|1
    const int N=20;
    int mp[105][10];
    bool vis[1<<11];
    int n,m;
    struct node
    {
        int s,d;
    };
    int bfs()
    {
        queue<node>q;
        q.push(node{(1<<n)-1,0});
        vis[(1<<n)-1]=1;
        while(!q.empty())
        {
            node u=q.front();q.pop();
            if(u.s==0)return u.d;
            rep(i,1,m)
            {
                int x=u.s;
                rep(j,1,n)
                {
                    if(mp[i][j]==1&&(1<<(j-1))&x )x^=(1<<(j-1));
    
                    else if(mp[i][j]==-1&&!( (1<<(j-1))&x ))x|=(1<<(j-1));
                }
                if(!vis[x])
                {
                    vis[x]=true;
                    q.push(node{x,u.d+1});
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        RII(n,m);
        rep(i,1,m)
        rep(j,1,n)
        RI(mp[i][j]);
        cout<<bfs();
        return 0;
    }
    View Code
  • 相关阅读:
    音频波谱通用类|超酷的说
    跟随鼠标的星星实例
    AS3放大镜工具类
    caurina缓动类
    AS3中 is,as,typeof的区别
    Loader ,URLLoader ,URLStream的区别
    (转)AS3正则:元子符,元序列,标志,数量表达符
    动态绘制扇形实例
    AS3.0绘图API
    as3效率优化
  • 原文地址:https://www.cnblogs.com/bxd123/p/10848718.html
Copyright © 2011-2022 走看看