洛谷 P2622 关灯问题II(状压DP入门题)
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入门题)的更多相关文章
- 关灯问题II 状压DP
关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- 洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...
- 洛谷P2622 关灯问题II
洛谷题目链接 声明: 本篇文章不讲基础,对萌新不太友好,(我就是萌新),要学状压$dp$的请另寻,这篇文章只是便于本人查看.... 首先看到$n<=10$,就可以考虑状压了,要求最小值,所以初始 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
- 洛谷 P1278 单词游戏 【状压dp】
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
随机推荐
- 利用Python制作简单的小程序:IP查看器
前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...
- centos7根分区扩容(亲测有效)
root@haojftest:~# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos_test2-root 28G 14G 15G % / devtmpfs ...
- Socket初见
前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...
- python时间模块time
时间模块 时间模块主要处理和时间相关的事件,我们可以通过模块获取不同数据类型的时间以便我们需求. 表现时间的三种方式: 在pythn中表现时间的方式主要有三种:时间戳(stamptime).元祖时间( ...
- 使用Promise解决多层异步调用的简单学习【转】
前言 本文章转载文章: https://www.jianshu.com/p/29da9aef4c1c 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心 ...
- maven+Spring+SpringMVC+Hibernate快速搭建
目录结构: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- #186 path(容斥原理+状压dp+NTT)
首先只有一份图时显然可以状压dp,即f[S][i]表示S子集的哈密顿路以i为终点的方案数,枚举下个点转移. 考虑容斥,我们枚举至少有多少条原图中存在的边(即不合法边)被选进了哈密顿路,统计出这个情况下 ...
- WIN8.1下Prolific USB-to-Serial Comm Port驱动黄色感叹号问题
文章解决来源:http://blog.csdn.net/gsj0791/article/details/17664861 在做fpga口的uart回环测试时候,由于开发板上的是usb转uart,所以需 ...
- Quartus prime 16.0 signaltap II 使用
前言 由于逻辑分析仪太贵,altera贴心提供signal tap II来观察输出波形,不过使能signaltap II会占用片内ram,毕竟原理就是把数据采样到ram中再通过jtag口上传到quar ...
- MT【290】内外圆求三角最值
求$\sqrt{\dfrac{5}{4}-\sin x}+2\sqrt{\dfrac{9}{4}+\cos x-\sin x}$的最小值. 提示:$\sqrt{\dfrac{5}{4}-\sin x} ...