题目大意

考虑一个 $4$ 行 $n$ ($4\le n\le 1000$)列的矩阵 $f$,$f$ 中的元素为 *.

对 $f$ 进行若干次如下变换:

将一个 $k\times k$($1\le k \le 4$)的子矩阵中的元素全部替换为 .,代价为 $a_k$( $1 \le a_k \le 1000$)。

求将 $f$ 中的元素全置为 * 所需的最小代价。

分析

很容易想到的做法是「状压 DP」。

Codeforces 上把「状态压缩」这个方法称作「bitmasks」。我从 Codeforces 的题解上读到,这种「铺地砖」类型的状压 DP, 英文可以叫做「DP on broken profile」。

将矩阵 $f$ 的列编号为 0 到 $n-1$ 。

DP 状态为

$c_{i,s}$:「第 0 列到第 $i-1$ 列全部置为 .,第 $i$ 到第 $\min(i+2,n-1)$ 列的状态为 $s$ ,而不管其余的列的状态如何」所需的最小代价。

如此设计 DP 状态考虑的是从左到右选取子矩阵做替换的过程。

这个 DP 状态是比较容易想到的,重点讨论如何转移:

一般而言,DP 状态的转移要满足原子性

所谓原子性是指,从状态 $S$ 转移到状态 $T$ 所经过的操作(或称「变换」)必须是一个不可再分的基本操作。在有的问题中(比如这道题)「不做任何操作」也是一种基本操作。

当然,从状态 $S$ 经过多个基本操作也可能到达状态 $T$;但是在构造状态转移方程时,我们只考虑单步转移。

这个问题中的基本操作就是选取某个子矩阵进行替换或者不做替换。

此外, DP 状态还要满足转移的完备性

所谓转移的完备性是指,从某一状态进行一次满足最优性的基本操作所到达的新状态必须能够被表示。

这里需要注意的是,从某个状态进行一个基本操作之后所能转移到的新状态可能不唯一(但一般是常数个)。

最优性条件往往用来减小在某个状态时需要考虑的基本操作的种类。

由「最优性」条件可知:

  1. 每次选取的子矩阵中至少要有一个 *
  2. 从状态 $(i,s)$ 转移时,所选的子矩阵的最左一列必须是第 $i$ 列。

经过上述分析,不难得出转移方法

枚举在状态 $(i,s)$ 时可进行的操作,计算转移到的新状态 $(i', s')$ ,更新「新状态」的 DP 值(即最小代价)。

这个问题中,「转移到的新状态」可能是两个。

容易疏忽的是:

对于状态 $(i,s)$,若第 $i$ 行全为 .,那么不经任何替换即可转移到状态 $(i+1, s')$;其中 $s'$ 表示 $i+1$ 列到 $\min(i+3,n-1)$ 列当前的状态。

实现细节

对于状压 DP,在进行状态转移时,用 bitset 取代位运算,实现起来更方便。

通过 bitset 提供的成员函数 to_ulong() 或者 to_ullong() 可以很方便地把状态压缩到一个整数里,作为 DP 数组的下标。

bitset 还可以用 >> 算符以 01 串的格式输出,低位在右,高位在左。

注意:在索引时,第 0 位是最低位。

另外,bitset 作为 sequential container 提供了 [] 运算符。

[] 有两个版本(重载),其返回值可以是 lvalue,也可以是 rvalue.

constexpr bool operator[]( std::size_t pos ) const;

reference operator[]( std::size_t pos );

第二个函数声明中的返回值的类型 referencebitset 定义的一个 proxy class 。

reference 类型支持的操作符只有:

operator=

operator bool

operator ~

flip

Codeforces 903F Clear the Matrix的更多相关文章

  1. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  2. Clear The Matrix CodeForces - 903F (状压)

    大意: 给定4行的棋盘以及4种大小的正方形方块, 每种各有一定花费, 每次可以选一种方块放在棋盘上, 棋盘对应格子全变为'.', 求最少花费使得棋盘全部变成'.' 状压基本操作练习, 状态取12位, ...

  3. CodeForces 313C Ilya and Matrix

    Ilya and Matrix Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  4. codeforces C. Ilya and Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/313/C 题目意思:给定 4n 个整数(可以组成 2n × 2n 大小的矩阵),问通过对这些整数进行排列, ...

  5. Educational Codeforces Round 40 C. Matrix Walk( 思维)

    Educational Codeforces Round 40 (Rated for Div. 2) C. Matrix Walk time limit per test 1 second memor ...

  6. codeforces 486B.OR in Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/486/B 题目意思:给出一个m行n列的矩阵B(每个元素只由0/1组成),问是否可以利用矩阵B,通过一定的运 ...

  7. Codeforces 1085G(1086E) Beautiful Matrix $dp$+树状数组

    题意 定义一个\(n*n\)的矩阵是\(beautiful\)的,需要满足以下三个条件: 1.每一行是一个排列. 2.上下相邻的两个元素的值不同. 再定义两个矩阵的字典序大的矩阵大(从左往右从上到下一 ...

  8. codeforces 495D Sonya and Matrix

    Since Sonya has just learned the basics of matrices, she decided to play with them a little bit. Son ...

  9. Codeforces 884E E. Binary Matrix

    题 OvO http://codeforces.com/contest/884/problem/E 884e 解 考虑并查集,每个点向上方和左方的点合并,答案即为1的总数减去需要合并的次数 由于只有1 ...

随机推荐

  1. SAP CRM Survey调查问卷的存储模型

    数据库表CRM_SVY_DB_SVS,通过如下的函数CRM_SVY_DB_SVS_CREATE插入: 可以通过指定的创建者和创建时间很容易查找到特定的Survey: 调查问卷的答案明细以XML的格式存 ...

  2. Android(java)学习笔记110:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  3. xml文件读取

    xml文件如下: <annotation> <folder>bnrc</folder> <filename>jena_000000_000019_lef ...

  4. 《毛毛虫组》【Alpha】Scrum meeting 2

    第二天 日期:2019/6/15 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: (1)对数据库表进行完善及测试: (2)定义Regex类的IsMatch()方法: (3)进行这一模块代 ...

  5. Python——字典dict()详解

    一.字典 字典是Python提供的一种数据类型,用于存放有映射关系的数据,字典相当于两组数据,其中一组是key,是关键数据(程序对字典的操作都是基于key),另一组数据是value,可以通过key来进 ...

  6. 01_8_session

    01_8_session 1. session总结 1.1服务器的一块内存(存key-value) 1.2和客户端窗口对应(子窗口)(独一无二) 1.3客户端和服务器有对应的SessionID 1.4 ...

  7. java第八次作业:课堂上发布的前5张图片(包括匿名对象、单例模式恶汉式、自动生成对象、args[]数组使用、静态关键字)

  8. luogu4608 [FJOI2016]所有公共子序列问题

    题目描述: luogu loj 题解: 序列自动机(?)+高精+普及dp. 这个是猫老师的序列自动机(字符串从1开始): ]) { memset(t[n],-,sizeof(t[n])); ;i> ...

  9. Java使用ResourceBundle类读取properties文件中文乱码的解决方案

    Java使用java.util.ResourceBundle类的方式来读取properties文件时不支持中文,要想支持中文必须将文件设置为ISO-8859-1编码格式,这对于开发工具默认为UTF-8 ...

  10. Vue之数据传递

    基础:vue的响应式规则 简单的props更新 父组件 <template> <div> <block-a :out-data="x">< ...