#\(\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. Thymeleaf学习记录(6)--迭代及条件语法

    迭代: 条件选择: IF-THEN: (if) ? (then) IF-THEN-ELSE: (if) ? (then) : (else) 默认: (value) ?: (defaultvalue) ...

  2. js串结构

    朴素匹配算法 //S 主串 T 模式串 //匹配失败,回溯 i = i - j + 1 j = 0 //匹配成功,返回位置 i - j function indexOf(S,T,pos = 0){ l ...

  3. cf1060D. Social Circles(贪心)

    题意 题目链接 Sol 我是这样考虑的:从大到小考虑每个\(l, r\),最大的\(l\)应该和最大的\(r\)匹配(不然就亏了),其次次大的\(r\)应该和次大的\(l\)匹配 然后就过了.. /* ...

  4. JavaWeb学习总结(四):Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  5. BootstrapValidator超详细教程

    一.引入必要文件 下载地址:(https://github.com/nghuuphuoc/bootstrapvalidator/archive/v0.4.5.zip) <link rel=&qu ...

  6. unity材质球贴图滚动

       using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBe ...

  7. Vue实例对象的数据选项(火柴)

    前言 一般地,当模板内容比较简单的时候,使用data选项配合表达式即可.涉及到复杂逻辑时,则需要用到methods.computed.watch等方法.本文将详细介绍Vue实例对象的数据选项. dat ...

  8. java 简单工厂 工厂模式

    <Head First 设计模式>学习中 分类 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) ...

  9. int占几个字节?

    class Program19 { static void Main(string[] args) { // true,或false Console.WriteLine("bool占用:&q ...

  10. SQL点点滴滴_公用表表达式(CTE)递归的生成帮助数据

    本文的作者辛苦了,版权问题特声明本文出处:http://www.cnblogs.com/wy123/p/5960825.html 工作有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连 ...