洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622
题面:
题目描述
现有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。把灯的开或关的状态用二进制1或0表示,所以开始时灯全部亮的状态就为1<<(n-1)(这里不是1<<n,可以手动模拟一下)这就是当前灯的状态。所以所求答案就是求由初始状态t=1<<(n-1)到t=0的次数。而题中所说的:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管 则可以通过按位与判断 ,然后通过按位与操作后进行取反,另一种情况同理。注释见代码
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
int a[200][200];
int ans[1500];
int main()
{
memset(ans, 0x3f, sizeof(ans));//取一个无穷大 操作次数永远不可能达到的次数
int n, m; // n个灯 m个按钮
scanf("%d %d", &n, &m);
for(int i = 1; i <=m; i++)//注意 n和m的位置不要写反
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
ans[(1 << n ) - 1] = 0;//灯全部打开的情况
for(int t = (( 1 << n) - 1); t >= 0; t--) // 1<<n-1对应n个1的二进制数 t等于0 对应灯全灭
{
for(int i = 1; i <= m; i++)//m次 操作
{
int now = t;
for(int j = 1; j <= n; j++) //进行一次操作后 n个灯的状态都进行改变
{
int temp = 1 << (j-1); //第j个灯 为开的状态
if(a[i][j] == 0)
continue;
else if(a[i][j] == 1 && (t & temp))
now &= ~temp; //x&=~(1<<y) 将某一位数置0
else if(a[i][j] == -1 && !(t & temp))
now |= temp;//x|=(1<<y) 将某一位数置1
}
ans[now] = min(ans[now], ans[t] + 1);
}
}
printf("%d\n", ans[0] == 1061109567 ? -1 : ans[0]);
return 0;
}
洛谷 P2622 关灯问题II【状压DP】的更多相关文章
- 洛谷 P2622 关灯问题II(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...
- 关灯问题II 状压DP
关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...
- 洛谷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 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 洛谷P2051 [AHOI2009] 中国象棋(状压dp)
题目简介 n*m的棋盘,对每行放炮,要求每行每列炮数<=2,求方案数%9999973 N,M<=100 题目分析 算法考虑 考虑到N,M范围较小,每一行状态只与前面的行状态有关,考虑状压D ...
随机推荐
- (六--一)scrapy框架简介和基础应用
一 什么是scrapy框架 官方解释 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 ( ...
- 【剑指Offer】面试题52. 两个链表的第一个公共节点
题目 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...
- MacOS Safari无响应卡死解决方法
之前也是用的好好的,突然一次进入一个网页就卡死了,强制退出,后面再重新进入Safari都会处于卡死状态,一直找不到解决方法,Safari也不能卸载重装,想着得等到更新系统或者重装系统,今天看到贴吧一个 ...
- Python Learning Day7
破解极验滑动验证 博客园登录url: https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 代码逻 ...
- consul集群配置
consul agent -server -bootstrap-expect 1 -data-dir /etc/consul -node=consul1 -bind=ip1 -ui -client=0 ...
- part10 header界面渐隐渐显 //动态路由//项目动画
两个组件只同时显示一个 可以用 a v-show='variable' b: v-show='!variable' 1.对全局事件的解绑 //代码容易出现大量bug 因为影响其他组件 keep-al ...
- Linux(CENTOS7) NodeJs安装
1.下载NodeJs 官网下载地址:http://nodejs.cn/download/ 2.上传到linux系统 我这里上传到/disk/nodejs目录下面的,上传工具使用的xftp. 3 ...
- PHP集成环境wamp和navicat for mysql 的安装
1. PHP集成环境WAMP的安装: 下载wamp: 链接:https://pan.baidu.com/s/1zvoPEbLdG7y04WWHNM6UcA 密码:mxd3 安装过程如下图: 安装完成 ...
- multi-task learning
多任务学习, CTR, CVR 任务同时训练, 同时输出概率.
- Maven--反应堆(Reactor)
在一个多模块的 Maven 项目中,反应堆是指所有模块组成的一个构建结构.对于单模块的项目,反应堆就是该模块本身.但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理 ...