#\(\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\)

  1. //pks学习专用
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std ;
  6. const int Inf = 1926081700 ;
  7. const int MAXN = 12, MAXM = 1025 ;
  8. int M, N, i, j, k, t, f[1 << MAXN], A[MAXM][MAXN] ;
  9. int main(){
  10. cin >> N >> M ;
  11. for(i = 1; i <= M; i ++)
  12. for(j = 1; j <= N; j ++)
  13. cin >> A[i][j] ;
  14. fill(f + 1, f + MAXM + 1, Inf) ;
  15. for(i = 0; i < (1 << N); i ++)
  16. for(k = 1; k <= M; k ++){
  17. t = i ;
  18. for(j = 0; j < N; j ++)
  19. if((A[k][j + 1] == 1 && !(i & 1 << j))||
  20. (A[k][j + 1] == -1 && (i & 1 << j)))
  21. t ^= (1 << j) ;
  22. f[t] = min(f[t], f[i] + 1) ;
  23. }
  24. if(f[(1 << N) - 1] == Inf) cout << "-1" << endl ;
  25. else cout << f[(1 << N) - 1] << endl ;
  26. }

随机推荐

  1. Spring与Web

    一.定义页面及Servlet 在jsp页面加入以下,避免乱码 <meta charset="utf-8"> <body> <form action=& ...

  2. Oracle Metadata

    http://www.devart.com/dotconnect/oracle/articles/metadata.htmlhttp://dcx.sybase.com/1101/en/dbprogra ...

  3. SqlServer代理(已禁用代理xp)

    SqlServer 本地库作业管理的时候已禁用,将其修改为可使用,master数据库下执行以下语句: sp_configure 'show advanced options', 1;  GO  REC ...

  4. 03.CSS动画-->自定义动画

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Shellinabox安装及使用教程

    本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...

  6. linq返回的IEnumerable<T>泛型不能被列举计算大于1次

    在分页获取Take后面加ToList()方法就能得到正确结果,为什么?

  7. Java 实时论坛 - Sym 1.4.0 发布

    简介 Sym 是一个用 Java 写的实时论坛,欢迎来体验! 如果你需要搭建一个企业内网论坛,请使用 SymX. 作者 Sym 的主要作者是 Daniel 与 Vanessa,所有贡献者可以在这里看到 ...

  8. C++学习笔记(8)----C++类的大小

    C++类的大小 (i) 如下代码: #include<iostream> using namespace std; class CBase { }; class CDerive :publ ...

  9. CAS服务器集群和客户端集群环境下的单点登录和单点注销解决方案

    CAS的集群环境,包括CAS的客户应用是集群环境,以及CAS服务本身是集群环境这两种情况.在集群环境下使用CAS,要解决两个问题,一是单点退出(注销)时,CAS如何将退出请求正确转发到用户sessio ...

  10. PHP把下划线分隔命名的字符串与驼峰式命名互转

    最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...