#\(\color{red}{\mathcal{Description}}\)

\(Link\)

现有\(n\)盏灯,以及\(m\)个按钮。每个按钮可以同时控制这\(n\)盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下\(i\)按钮对于第\(j\)盏灯,是下面\(3\)中效果之一:如果\(a[i][j]\)为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为\(-1\)的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是\(0\),无论这灯是否开,都不管。

现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。

#\(\color{red}{\mathcal{Solution}}\)

\(emmmm\)一开做这个题的时候是为了刷最短路水题的来着……结果发现好像需要状态压缩??等会儿,我都压完了还跑什么sb最短路啊,直接DP不就行了吗……我们发现这个题好像只要一维就行(你也找不出第二维啊),我们令\(dp_i\)表示到达状态\(i\)时所需要的最小步数,如果初始位置是全0状态,那么答案就是\(dp_{(1 << n)-1}\)(即\(n\)个灯都是开着的状态)。

然后就只要判断一下状态是否合法即可,转移时的状态转移方程就是$dp_{new} = min{dp_{last}+1} $

\(emmmm\)至于最短路什么的还是日后再说吧\(qwq\)

\(Code\)

//pks学习专用
#include <cstdio>
#include <iostream>
#include <algorithm> using namespace std ;
const int Inf = 1926081700 ;
const int MAXN = 12, MAXM = 1025 ;
int M, N, i, j, k, t, f[1 << MAXN], A[MAXM][MAXN] ; int main(){
cin >> N >> M ;
for(i = 1; i <= M; i ++)
for(j = 1; j <= N; j ++)
cin >> A[i][j] ;
fill(f + 1, f + MAXM + 1, Inf) ;
for(i = 0; i < (1 << N); i ++)
for(k = 1; k <= M; k ++){
t = i ;
for(j = 0; j < N; j ++)
if((A[k][j + 1] == 1 && !(i & 1 << j))||
(A[k][j + 1] == -1 && (i & 1 << j)))
t ^= (1 << j) ;
f[t] = min(f[t], f[i] + 1) ;
}
if(f[(1 << N) - 1] == Inf) cout << "-1" << endl ;
else cout << f[(1 << N) - 1] << endl ;
}

随机推荐

  1. 最简单的java多线程代码(重写thread或者runnable的run方法)

    http://blog.csdn.net/testcs_dn/article/details/42526549 java线程使用示例——最简单的线程 线程使用示例一: [java] view plai ...

  2. javascript之url转义escape()、encodeURI()和decodeURI(),ifram父子传参参数有中文时出现乱码

    ifram父子传参参数有中文时出现乱码,可先在父级页面用encodeURI转义,在到子页面用进行decodeURI()解码 我们可以知道:escape()除了 ASCII 字母.数字和特定的符号外,对 ...

  3. data-id 和 id 的区别

    作者:Zeropoint零点 来源:CSDN 原文:https://blog.csdn.net/qq_41648132/article/details/80364335 版权声明:本文为Zeropoi ...

  4. 转:在使用angularjs过程,ng-repeat中track by的作用

    转载:链接 <div ng-repeat="links in slides"> <div ng-repeat="link in links track ...

  5. 匿名内部类中关于new Runnable()的使用

    匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写. 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 1.继承一个父类的匿名内部类实现 ...

  6. CentOS7运维管理笔记(12)----修改主机名

    CentOS修改主机名 CentOS7和CentOS6.5 修改主机名的方法略有不同. 通过 hostname 命令可以查看当前的主机名. 1. 临时修改主机名 通过 'hostname 新的主机名' ...

  7. centos7安装lua语言环境

    Linux 上安装 Lua 安装非常简单,只需要下载源码包并在终端解压编译即可. 官网地址:http://www.lua.org/download.html 我这里安装的是:lua-5.3.0.tar ...

  8. RN 解决CFBundleIdentifier", Does Not Exist

    mac环境下,在命令行中run-ios构建时报错:CFBundleIdentifier", Does Not Exist 打开XCode,进入.xcodeproj文件,运行,编译时报错:'b ...

  9. 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    尽管 Azure 资源管理器提供了许多精彩功能,但请务必计划迁移,以确保一切顺利进行. 花时间进行规划可确保执行迁移活动时不会遇到问题. Note 以下指导的主要参与者为 Azure 客户顾问团队,以 ...

  10. .net core系列之《.net core中使用集成IDistributedCache接口的Redis和MongoDB实现分布式缓存》

    分布式的缓存可以提高性能和可伸缩性的 ASP.NET Core 应用程序,尤其是托管在云中或服务器场中时. 什么是分布式的缓存 分布式的缓存由多个应用程序服务器共享,缓存中的信息不存储在单独的 Web ...