[状压DP]关灯问题II
关
灯
问
题
I
I
关灯问题II
关灯问题II
题目描述
现有n盏灯,以及
m
m
m个按钮。每个按钮可以同时控制这
n
n
n盏灯——按下了第
i
i
i个按钮,对于所有的灯都有一个效果。按下i按钮对于第
j
j
j盏灯,是下面
3
3
3中效果之一:如果
a
[
i
]
[
j
]
a[i][j]
a[i][j]为
1
1
1,那么当这盏灯开了的时候,把它关上,否则不管;如果为
−
1
-1
−1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是
0
0
0,无论这灯是否开,都不管。
现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。
输入
前两行两个数,
n
,
m
n,m
n,m
接下来
m
m
m行,每行
n
n
n个数,
a
[
i
]
[
j
]
a[i][j]
a[i][j]表示第
i
i
i个开关对第
j
j
j个灯的效果。
输出
一个整数,表示最少按按钮次数。如果没有任何办法使其全部关闭,输出
−
1
-1
−1
样例输入
3
2
1 0 1
-1 1 0
样例输出
2
题目解析
先讲一下题目大意,有
n
n
n盏电灯,
m
m
m个开关。
m
m
m个开关对每盏电灯都有一个不同的效果;
例如,有
3
3
3盏电灯,
2
2
2个开关,那么每个开关都有
3
3
3个值,分别是对第
1
1
1个开关,第
2
2
2个开关,第
3
3
3个开关的值。这个值有
3
3
3种类型:如果为
1
1
1,那么当这盏灯开了的时候,把它关上,否则不管;如果为
−
1
-1
−1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是
0
0
0,无论这灯是否开,都不管。
因为
0
0
0的状态是不会改变电灯的状态的,所以只有
2
2
2种状态是有用的。
---------------------------------------------------------分割线------------------------------------------------------------------
然后,我们用状压DP来做这一题。我们用一个二进制数来表示当前电灯的状态,并转为十进制储存到数组里。而修改状态就使用位运算来处理。
code
#include<cmath>
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int n, m, et=1;
int dp[1 << 10], a[105][15];
int main ()
{
scanf ("%d%d",&n,&m);
for (int i = 1; i <= m; ++i)
{
for (int j = 1; j <= n; ++j)
{
scanf("%d",&a[i][j]);
}
}
memset(dp,0x3f,sizeof(dp));
dp[(1 << n) - 1]=0;
for (int i = (1 << n) - 1; i >= 0; --i)
{
for (int j=1; j <= m; ++j)
{
et=i;
for (int k=1; k <= n; ++k)
{
if (!a[j][k]) continue;
else if (a[j][k] == 1 && (i & (1 << k - 1)))
et ^= (1 << (k - 1));
else if (a[j][k] == -1 && !(i & (1 << k - 1)))
et ^= (1 << k - 1);
}
dp[et] = min (dp[et], dp[i] + 1);
}
}
printf ("%d", dp[0] == 0x3f3f3f3f ? -1 : dp[0]);
return 0;
}
[状压DP]关灯问题II的更多相关文章
- 状压DP【p2622】 关灯问题II
题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...
- 关灯问题II 状压DP
关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...
- 洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...
- [状压DP]车II
车 I I 车II 车II 题目描述 有一个 n ∗ m n*m n∗m的棋盘 ( n . m ≤ 80 , n ∗ m ≤ 80 ) (n.m≤80,n*m≤80) (n.m≤80,n∗m≤80)要 ...
- HDU 6149 Valley Numer II 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...
- HDU 6149 Valley Numer II(状压DP)
题目链接 HDU6149 百度之星复赛的题目……比赛的时候并没有做出来. 由于低点只有15个,所以我们可以考虑状压DP. 利用01背包的思想,依次考虑每个低点,然后枚举每个状态. 在每个状态里面任意枚 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- 状压DP总结
状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
随机推荐
- js 动态构建style
使用创建style的方式 btn.addEventListener("click", async () => { const ns = document.createElem ...
- Union international INC:VR线下娱乐市场巨大
联合国际公司认为众多企业追着VR的风口不断加码,导致VR在经历了一个爆炸式的发展,如今部分VR公司开始觉得日子不好过了,一个重要表现就是现金流紧张.VR如何能够普及,何时能够及早变现,成为业内关注的焦 ...
- springCloud中的服务调用feign
springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...
- restful风格的理解
简而言之,就是不同的命令响应不同的操作: 关注点在url中的不同参数,是因为不同的参数才使得不同的method去对应的不同的操作.
- 简单梳理下 Vue3 的新特性
在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...
- TERSUS无代码开发(笔记05)-简单实例电脑端页面设计
案例笔记电脑端页面设计 1.新建项目(请假管理qjgl) 2.开发软件界面介绍(常用的功能按键) 3.目录中显示元件对象 4.对元件对象的操作主要方式是双击(双击哪个元件, ...
- Mybatis-Plus插件配置
yml配置 1 # Mybatis-Plus 2 mybatis-plus: 3 # 配置mapper的扫描,找到所有的mapper.xml映射文件 4 mapper-locations: com.x ...
- 注册 Amazon Web Services(AWS) 账号,助园一臂之力
感谢大家去年的大力支持,今年园子继续和 Amazon Web Services(AWS) 合作,只要您通过 博客园专属链接 注册一个账号(建议使用手机4G网络注册),亚马逊就会给园子收入,期待您的支持 ...
- 你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?
前言 过年回来的第二周了,终于有时间继续总结知识了.这次来看一下SQL调优的知识,这类问题基本上面试的时候都会被问到,无论你的岗位是后端,运维,测试等等. 像本文标题中的两个问题,就是我在实际面试过程 ...
- Shiro反序列化漏洞检测、dnslog
目录 信息收集 poc 参考 信息收集 poc # pip install pycrypto import sys import base64 import uuid from random impo ...