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\) 次询问,每次 ...
随机推荐
- “介绍一下自己吧”——记2020BUAA软工团队介绍和采访
写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队作业-团队介绍和采访 团队介绍 团队名称 我们是 BUAA软软软件工程小队 ,简称 ...
- [no code][scrum meeting] Beta 10
$( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...
- Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
申明,本教程 Intellij IDEA 最新版破解.激活码均收集与网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.如条件允许,建议大家购买正版. 本教程更新于:2021 年 10 月 ...
- seata整合多数据源
seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...
- filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...
- java中的软,弱,虚引用介绍与特性分析
java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会 ...
- Noip模拟72 2021.10.9
T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按 ...
- 攻防世界 杂项 11.simple_transfer
题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...
- AOP源码解析:AspectJExpressionPointcutAdvisor类
先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...
- NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。
老扫漏洞出来要整改 1.在 /etc/下创建一个文件 ssh_banner_change,在文件中输入内容,如:welcome! 2.修改/etc/ssh/sshd_config 文件,添加以下内容: ...