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的更多相关文章

  1. 状压DP【p2622】 关灯问题II

    题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...

  2. 关灯问题II 状压DP

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

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

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

  4. [状压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)要 ...

  5. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  6. HDU 6149 Valley Numer II(状压DP)

    题目链接 HDU6149 百度之星复赛的题目……比赛的时候并没有做出来. 由于低点只有15个,所以我们可以考虑状压DP. 利用01背包的思想,依次考虑每个低点,然后枚举每个状态. 在每个状态里面任意枚 ...

  7. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  8. 状压DP总结

    状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算 ...

  9. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

随机推荐

  1. Vue Learning Paths

    Vue Learning Paths Vue Expert refs https://vueschool.io/articles/vuejs-tutorials/exciting-new-featur ...

  2. 中文域名 & 原理剖析

    中文域名 & 原理剖析 https://zh.wikipedia.org/wiki/中文域名 原理 利用浏览器的对字符编码的转换算法,实现 unicode 字符显示! 国际化域名: 就是一个普 ...

  3. learning-js-by-reading-source-codes

    learning-js-by-reading-source-codes BigInt https://github.com/learning-js-by-reading-source-codes/lo ...

  4. npm install 原理

    npm install 原理 https://docs.npmjs.com/about-npm/ npm consists of three distinct components: the webs ...

  5. Flutter: 下拉刷新,上拉加载更多

    import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; void main ...

  6. 法兰西金融专访SPC空投重磅来袭

    最近,法兰西金融日报联合德意志财经等知名金融媒体就SPC这一话题进行了专访. 法兰西金融日报记者德维尔斯问到,之前2020年的BGV项目等市场反响异常火爆,2021年已经来到,NGK目前有何新的大动作 ...

  7. 死磕以太坊源码分析之EVM指令集

    死磕以太坊源码分析之EVM指令集 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 以下指令集 ...

  8. Filter理解

    web中Filter通过<init-param>添加参数.web.xml中的配置: <filter> <filter-name>AuthFilter</fil ...

  9. Spring IoC总结

    Spring 复习 1.Spring IoC 1.1 基本概念 1.1.1 DIP(Dependency Inversion Principle) 字面意思依赖反转原则,即调用某个类的构造器创建对象时 ...

  10. 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)

    这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2  图像的运算 复杂的 ...