关灯问题II 状压DP

\(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完。

\(n\le 10,m\le 100\)

状压DP的好题,体现了状压的基本套路与二进制操作

注意到此题\(n\)极小,一般小于\(16\)就可以做状压,并且发现每次转移时需要每盏灯的信息,于是我们直接将灯状态塞进二进制即可。

首先我们从初态开始按顺序枚举状态,然后枚举每次状态的决策,最后按题意转移到下一个状态即可。

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 11
#define MAXM 110
using namespace std;
int n,m;
int a[MAXM][MAXN];
int f[1<<10];
int main(){
scanf("%d%d", &n, &m);
int mxf=(1<<n)-1;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
scanf("%d", &a[i][j]);
memset(f, 0x3f, sizeof f);
f[mxf]=0;
for(int i=mxf;i>=0;--i){
for(int j=1;j<=m;++j){
int to=i;
for(int k=1;k<=n;++k){
if(a[j][k]==0) continue;
if(a[j][k]==1 && (to & (1<<(k-1))) ) to=to^(1<<(k-1));
if(a[j][k]==-1 && !(to & (1<<(k-1))) ) to=to^(1<<(k-1));
}
f[to]=min(f[i]+1, f[to]);
}
}
if(f[0]==0x3f3f3f3f) puts("-1");
else printf("%d\n", f[0]);
return 0;
}

最新文章

  1. HTML5的全新语义化元素
  2. 基于zepto的移动端日期+时间选择插件
  3. webpack学习笔记
  4. BZOJ1212——L语言
  5. CentOs5.8下安装Oracle12C
  6. MQTT——安装、测试
  7. rm排除指定文件或指定文件夹下文件
  8. SIMPASS技术解析
  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
  10. Mybatis——choose, when, otherwise可以达到switch case效果
  11. 个人认为一个比较完整,基于tp5平台,可快速开发的B2C平台
  12. window炫丽cmd的别名cmder
  13. .NET手记-Autofac进阶(注册的概念 Registering Concepts)
  14. Oracle sqlplus失去响应解决方法/如何在数据库失去响应时转储状态信息(转)
  15. vue组件库(二):基于verdaccio工具npm私服搭建
  16. express4.x Request对象获得参数方法小谈【原创】
  17. mybatis笔记之使用Mapper接口注解
  18. .net 4.5如何使用Async和Await进行异步编程
  19. vue cli 构建的 webpack 项目设置多页面
  20. beanshell引用参数化数据

热门文章

  1. Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)
  2. wpf 把两个Bitmap 合并为一个
  3. java之struts2之异常处理
  4. WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题
  5. fiddler数据过滤功能
  6. 数据结构与算法(周测9-B树与B+树)
  7. 能够提高PHP的性能的一些注意事项
  8. centOS学习part5:oracle 11g安装之环境准备
  9. Hadoop常用命令及范例
  10. UCOSIII优先级反转