题面传送门

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)的更多相关文章

  1. LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划

    题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...

  2. LOJ 2547 「JSOI2018」防御网络——思路+环DP

    题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...

  3. LOJ 3056 「HNOI2019」多边形——模型转化+树形DP

    题目:https://loj.ac/problem/3056 只会写暴搜.用哈希记忆化之类的. #include<cstdio> #include<cstring> #incl ...

  4. loj#2071. 「JSOI2016」最佳团体

    题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. “介绍一下自己吧”——记2020BUAA软工团队介绍和采访

    写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队作业-团队介绍和采访 团队介绍 团队名称 我们是 BUAA软软软件工程小队 ,简称 ...

  2. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...

  3. Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)

    ​ 申明,本教程 Intellij IDEA 最新版破解.激活码均收集与网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.如条件允许,建议大家购买正版. 本教程更新于:2021 年 10 月 ...

  4. seata整合多数据源

    seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...

  5. filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理

    filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...

  6. java中的软,弱,虚引用介绍与特性分析

    java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会 ...

  7. Noip模拟72 2021.10.9

    T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按 ...

  8. 攻防世界 杂项 11.simple_transfer

    题目描述: 文件里有flag,找到它. 题目分析: 文件解压后是一个抓包流量分析文件,用 wireshark 打开后,用分组字节流搜索 flag,追踪 TCP 流,可以隐约看到有 file.pdf, ...

  9. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  10. NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。

    老扫漏洞出来要整改 1.在 /etc/下创建一个文件 ssh_banner_change,在文件中输入内容,如:welcome! 2.修改/etc/ssh/sshd_config 文件,添加以下内容: ...