[状压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,这基本 ...
随机推荐
- Vue Learning Paths
Vue Learning Paths Vue Expert refs https://vueschool.io/articles/vuejs-tutorials/exciting-new-featur ...
- 中文域名 & 原理剖析
中文域名 & 原理剖析 https://zh.wikipedia.org/wiki/中文域名 原理 利用浏览器的对字符编码的转换算法,实现 unicode 字符显示! 国际化域名: 就是一个普 ...
- learning-js-by-reading-source-codes
learning-js-by-reading-source-codes BigInt https://github.com/learning-js-by-reading-source-codes/lo ...
- npm install 原理
npm install 原理 https://docs.npmjs.com/about-npm/ npm consists of three distinct components: the webs ...
- Flutter: 下拉刷新,上拉加载更多
import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; void main ...
- 法兰西金融专访SPC空投重磅来袭
最近,法兰西金融日报联合德意志财经等知名金融媒体就SPC这一话题进行了专访. 法兰西金融日报记者德维尔斯问到,之前2020年的BGV项目等市场反响异常火爆,2021年已经来到,NGK目前有何新的大动作 ...
- 死磕以太坊源码分析之EVM指令集
死磕以太坊源码分析之EVM指令集 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 以下指令集 ...
- Filter理解
web中Filter通过<init-param>添加参数.web.xml中的配置: <filter> <filter-name>AuthFilter</fil ...
- Spring IoC总结
Spring 复习 1.Spring IoC 1.1 基本概念 1.1.1 DIP(Dependency Inversion Principle) 字面意思依赖反转原则,即调用某个类的构造器创建对象时 ...
- 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)
这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2 图像的运算 复杂的 ...