LOJ 2372 -「CEOI2002」臭虫集成电路公司(轮廓线 dp)
u1s1 似乎这题全网无一题解?那就由我来写篇题解造福人类罢(伦敦雾
首先看这数据范围,一脸状压。考虑到每一层的状态与上面两层有关,因此每层转移到下一层的有用信息只有两层,需要用三进制保存状态。不过如果我们按照套路对行的状态进行压缩,我们就需要用这个状态进行 \(dfs\) 枚举各种放的情况并更新答案,实现起来会比较繁琐。因此这里采用另一种做法。
我们考虑一格格填 instead of 一行行填,具体来说,我们先考虑第一行第一列的状态,考虑完之后再考虑第一行第二列、第一行第三列……第一行考虑完之后再考虑第二行,以此类推,显然转移过的格子和没转移过的格子被一个折线分成了两半。这个折线我们称其为轮廓线。
考虑状压轮廓线上方格子的状态,具体来说,我们记 \(dp_{x,y,S}\) 表示当前考虑到第 \(x\) 行第 \(y\) 列,\(S\) 是一个三进制数,描述了轮廓线上方格子的状态,其中 \(S\) 的 \(3^{j-1}\) 位为 \(0\) 表示第 \(j\) 列轮廓线上方有 \(0\) 个空格子,为 \(1\) 表示第 \(j\) 列轮廓线上方有 \(1\) 个空格子,为 \(2\) 表示第 \(j\) 列轮廓线上方有 \(2\) 个空格子,那么有转移:
- 若 \(x=1\) 那显然 \(dp_{x,y,S}=0\)
- 如果 \(S\) 的 \(3^{y-1}\) 位 \(\ge 1\),那么格子 \((x,y)\) 被强制留空,我们就只能从 \((x,y)\) 前一个格子 \((x',y')\) 转移过来,第 \(y\) 列轮廓线向上移了一格,第 \(y\) 列上方空格子的个数也就少了 \(1\),故 \(dp_{x,y,S}=dp_{x',y',S-3^{y-1}}\)。
- 否则 \(dp_{x,y,S}\) 可能有三种转移方式:
- \((x,y)\) 留空,\(dp_{x,y,S}=dp_{x',y',S}\),其中 \((x',y')\) 为 \((x,y)\) 前一个被访问的格子。
- 以 \((x,y)\) 为右下角横着(左上角为 \((x-1,y-2)\))放一个 \(2\times 3\) 的矩形,\(dp_{x,y,S}=dp_{x',y',S+3^{y-1}+3^{y-2}+3^{y-3}}+1\),其中 \((x',y')\) 为 \((x,y)\) 倒推三格的格子,这种情况转移的前提条件是 \(S\) 中 \(3^{y-1},3^{y-2},3^{y-3}\) 位都是 \(0\),并且以 \((x,y)\) 为右下角,\((x-1,y-2)\) 为左上角的矩形不含特殊格子。
- 以 \((x,y)\) 为右下角竖着(左上角为 \((x-2,y-1)\))放一个 \(3\times 2\) 的矩形,\(dp_{x,y,S}=dp_{x',y',S+2\times 3^{y-1}+2\times 3^{y-2}}+1\),其中 \((x',y')\) 为 \((x,y)\) 倒推两格的格子,这种情况转移的前提条件是 \(S\) 中 \(3^{y-1},3^{y-2}\) 位都是 \(0\),并且以 \((x,y)\) 为右下角,\((x-2,y-1)\) 为左上角的矩形不含特殊格子。
就这样转移就行了,时空复杂度均为 \(nm3^m\)。由于此题空间限制较小,需滚动数组优化转移,需记录当前点往前 \(4\) 格的 \(dp\) 值。这样空间复杂度就能降到 \(3^m\) 了。
const int MAXN=150;
const int MAXS=6e4;
const int MAXM=10;
int n,m,k,dp[5][MAXS+5],pw3[MAXM+5];bool bad[MAXN+5][MAXM+5];
int getbit(int x,int y){return x/pw3[y]%3;}
void solve(){
scanf("%d%d%d",&n,&m,&k);memset(bad,0,sizeof(bad));memset(dp,0,sizeof(dp));
for(int i=1,x,y;i<=k;i++) scanf("%d%d",&x,&y),bad[x][y]=1;
int cur=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
cur=(cur+1)&3;
int can_hor=(i>=2&&j>=3&&!bad[i][j]&&!bad[i-1][j]&&!bad[i][j-1]&&!bad[i-1][j-1]&&!bad[i][j-2]&&!bad[i-1][j-2]);
int can_ver=(i>=3&&j>=2&&!bad[i][j]&&!bad[i-1][j]&&!bad[i-2][j]&&!bad[i][j-1]&&!bad[i-1][j-1]&&!bad[i-2][j-1]);
// printf("%d %d %d %d\n",i,j,can_hor,can_ver);
for(int s=0;s<pw3[m];s++){
if(i==1) dp[cur][s]=0;
else if(getbit(s,j-1)>0) dp[cur][s]=dp[(cur-1)&3][s-pw3[j-1]];
else{
dp[cur][s]=dp[(cur-1)&3][s];
if(can_hor&&getbit(s,j-2)==0&&getbit(s,j-3)==0)
chkmax(dp[cur][s],dp[(cur-3)&3][s+pw3[j-1]+pw3[j-2]+pw3[j-3]]+1);
if(can_ver&&getbit(s,j-2)==0)
chkmax(dp[cur][s],dp[(cur-2)&3][s+2*pw3[j-1]+2*pw3[j-2]]+1);
}
// printf("%d %d %d %d\n",i,j,s,dp[cur][s]);
}
} printf("%d\n",dp[cur][0]);
}
int main(){
pw3[0]=1;for(int i=1;i<=MAXM;i++) pw3[i]=pw3[i-1]*3;
int qu;scanf("%d",&qu);while(qu--) solve();
return 0;
}
LOJ 2372 -「CEOI2002」臭虫集成电路公司(轮廓线 dp)的更多相关文章
- LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划
题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...
- LOJ 2547 「JSOI2018」防御网络——思路+环DP
题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...
- LOJ 3056 「HNOI2019」多边形——模型转化+树形DP
题目:https://loj.ac/problem/3056 只会写暴搜.用哈希记忆化之类的. #include<cstdio> #include<cstring> #incl ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- tomcat内存马原理解析及实现
内存马 简介 Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站.应用.但传统的Webshell都是基于文件类型的,黑客 ...
- [对对子队]团队任务拆解Alpha
Alpha阶段主要目标 完成游戏场景的基本实现(不要求美术资源) 完成游戏UI的基本实现(不要求美术资源) 制作第一部分的关卡(顺序语句,制作3-5关) 完成第一部分关卡和游戏基本逻辑的测试 任务分解 ...
- 使用Keil下载Hex文件进STM32
前言 初学STM32时,是通过串口1把Hex文件下载进STM32的,需要一个串口模块,而且还要设置BOOT0和BOOT1电平,然后通过FlyMcu软件进行下载,这也是一种不错的方法,这里我要介绍的是使 ...
- 最长子序列(线性DP)学习笔记
子序列和子串不一样.子串要求必须连续,而子序列不需要连续. 比如说\(\{a_1,a_2\dots a_n\}\),他的子串就是\(\{a_i,a_{i+1},\dots, a_j|1\leq i\l ...
- Codeforces Round #738 (Div. 2) D2题解
D2. Mocha and Diana (Hard Version) 至于D1,由于范围是1000,我们直接枚举所有的边,看看能不能加上去就行,复杂度是\(O(n^2logn)\).至于\(n\)到了 ...
- cloudstack部署
参考文档 https://blog.csdn.net/u012124304/article/details/80960504#Mysql_37 cloudstack的rpm包下载地址 http://d ...
- Kubernetes Deployment 源码分析(二)
概述startDeploymentController 入口逻辑DeploymentController 对象DeploymentController 类型定义DeploymentController ...
- 全面!总结BQ系列阻抗跟踪电量计化学Chemical ID配置和Golden学习方法
BQ系列阻抗跟踪电量计SOC最高能达到1%,功能强大,应用起来也比较复杂.不仅要配置好参数,匹配好化学ID,并且进行好Golden学习和相关测试.本文就讲述ID匹配,Golden学习和测试的终极方法流 ...
- 记一次,因表变量导致SQL执行效率变慢
场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析 首先,对于JO ...
- loadrunner12自带的机票预订服务,解决httpd: Could not reliably determine the server's fully qualified domain name 问题
遇到以上问题是在启动loadrunner12自带的机票预订服务器情况下遇到的,错误提示如下图: 解决方案: 编辑httpd.conf 文件,加入一句 ServerName localhost:1080 ...