传送门

https://www.cnblogs.com/violet-acmer/p/9852294.html

题解:

  相关变量解释:

 int n,m;
int a[maxn][];//a[i][j] : 第i个开关对第j个灯的效果。
bool vis[R()];//vis[i] : 判断状态i是否被访问过
struct Node
{
int status;//状态
int minTimes;//来到当前状态按下开关的最小次数
Node(int a=,int b=):status(a),minTimes(b){}
};
queue<Node >myqueue;//用队列中的状态去解锁其他为解锁(访问)过的状态,并能保证被解锁的状态的minTimes最小

  步骤:

  (1):将Node( (1<<n)+1,0 ) 加入队列,因为初始等全是亮的,对应到二进制就是n个1,并且需要 0 次按下开关。

  (2):从队头依次弹出元素,并用当前状态去解锁其他状态,并能保证被其解锁的状态的minTimes是最小的。

  (3):重复(2)过程,直到找到 0 状态或队列为空

AC代码:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define R(x) (1<<x)
const int maxn=+; int n,m;
int a[maxn][];//a[i][j] : 第i个开关对第j个灯的效果。
bool vis[R()];//vis[i] : 判断状态i是否被访问过
struct Node
{
int status;//状态
int minTimes;//来到当前状态按下开关的最小次数
Node(int a=,int b=):status(a),minTimes(b){}
};
queue<Node >myqueue;//用队列中的状态去解锁其他为解锁(访问)过的状态,并能保证被解锁的状态的minTimes最小 int nextStatus(int nowStatus,int i)
{
int x=nowStatus;
for(int j=;j <= n;++j)//从右往左一一对应
{
if(a[i][j] == && (x>>(j-)&))//一定要注意判断x的第j为是否为1
x ^= (<<(j-));//^ : 相同为0,不同为1
else if(a[i][j] == -)
x |= (<<(j-));
}
return x;
}
int updataQ(Node node)
{
for(int i=;i <= m;++i)
{
int status=nextStatus(node.status,i);//找到当前状态node.status可以解锁的下一状态
if(!vis[status])//如果被访问过,那么其minTimes肯定要小于当前的minTimes+1
myqueue.push(Node(status,node.minTimes+)),vis[status]=true;
if(status == )//判断被解锁的状态是否为0状态
return node.minTimes+;
}
return ;
}
int Solve()
{
mem(vis,false);
while(!myqueue.empty())
myqueue.pop();
myqueue.push(Node(R(n)-,));//步骤(1)
while(!myqueue.empty())//步骤(2)(3)
{
Node node=myqueue.front();
myqueue.pop();
int res=updataQ(node);//更新队列中的状态
if(res != )//判断被解锁的状态是否有0状态,如果有,直接输出,一定是最小的按下次数
return res;
}
return -;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i <= m;++i)
for(int j=n;j >= ;--j)//j : n down 1 用意:与二进制的位数一一对应(从右往左)
scanf("%d",a[i]+j);
printf("%d\n",Solve());
}

洛谷 P2622 关灯问题II(状压DP入门题)的更多相关文章

  1. 关灯问题II 状压DP

    关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...

  2. 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  3. 洛谷 P2622 关灯问题II【状压DP】

    传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...

  4. 洛谷P2622 关灯问题II

    洛谷题目链接 声明: 本篇文章不讲基础,对萌新不太友好,(我就是萌新),要学状压$dp$的请另寻,这篇文章只是便于本人查看.... 首先看到$n<=10$,就可以考虑状压了,要求最小值,所以初始 ...

  5. 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)

    洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...

  6. 洛谷 P1278 单词游戏 【状压dp】

    题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...

  7. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  8. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  9. 洛谷P2831 愤怒的小鸟——贪心?状压DP

    题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...

随机推荐

  1. QTP 自动化测试--定义变量

    1 Dim suffixsuffix=get_currentdatetxt("001")

  2. 比特币中的Base58 编码

    base58和base64一样是一种二进制转可视字符串的算法,主要用来转换大整数值.区别是,转换出来的字符串,去除了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母 ...

  3. Running ASP.NET Core applications on Windows Subsystem for Linux

    Setting up Linux on Windows 10 First thing is to enable Windows Subsystem for Linux. It doesn’t inst ...

  4. iOS 通知推送APNS

    结合网上各个资料,再简单整理的一份. 一.APNS推送说明 1.你的IOS应用需要去注册APNS消息推送功能. 2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你 ...

  5. 【建模应用】PLS偏最小二乘回归原理与应用

    @author:Andrew.Du 声明:本文为原创,转载请注明出处:http://www.cnblogs.com/duye/p/9031511.html,谢谢. 一.前言 1.目的: 我写这篇文章的 ...

  6. 彻底弄懂 HTTP 缓存机制及原理 | 干货

    来源:www.cnblogs.com/chenqf/p/6386163.html 前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个 ...

  7. Matplotlib学习---用matplotlib画柱形图,堆积柱形图,横向柱形图(bar chart)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/hot-dog-cont ...

  8. opencv图像融合(大头)

    单纯的变大再覆盖上去,头部检测信息不够全,效果实在是太差,就不多说了,只是按照自己的思路玩一玩,没有达到抖音上那么好的效果 import cv2 as cv import numpy as np im ...

  9. 【BZOJ5317】[JSOI2018]部落战争(凸包,闵可夫斯基和)

    [BZOJ5317][JSOI2018]部落战争(凸包,闵可夫斯基和) 题面 BZOJ 洛谷 题解 很明显我们只需要两个凸包\(A,B\). 假设询问给定的方向向量是\(v\). 那么现在就是判断\( ...

  10. 「TJOI2015」旅游 解题报告

    「TJOI2015」旅游 LCT沙比题 考虑我们其实是在维护一条链的\(\max\limits_{i<j} v_j-v_i\) 每次直接拿左右子树更新一下就可以了 写的时候把两个方向都维护一下, ...