正题


题目大意

给出n×mn\times mn×m的网格填着−1∼4-1\sim 4−1∼4的数字,对于将所有的−1-1−1填上0∼40\sim 40∼4的方案中,定义方案XXX的权值,设在相邻网格之间连线(每对只能连一条)使得每个网格连出去的边数恰好位数字的方案数为f(X)f(X)f(X),那么权值为f2(X)f^2(X)f2(X)。

求所有方案的权值和,对998244353998244353998244353取模。

1≤T≤10,1≤n≤70,1≤m≤61\leq T\leq 10,1\leq n\leq 70,1\leq m\leq 61≤T≤10,1≤n≤70,1≤m≤6


解题思路

主要的难点在这个平方处,我们有道经典处理方案数平方的例题[NOI2009]管道取珠,做法就是同时维护两个共线推进的方案,这样每对方案之间都有贡献,方案数就平方了。

但是这样的状态也是平方的,我们需要考虑压缩一下状态,正常来说的插头dpdpdp可能是O(5m)O(5^m)O(5m)的状态,但是注意到每队网格只能连一条边,所以对于每个块最多只能剩下插头数的状态,也就是除了当且枚举快左边那个以外都是222个状态,这样状态就很少了,只有969696种,直接平方做然后插头dpdpdp转移即可。


code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int P=998244353;
int T,n,m,f[2][16384],v[2][16384],s[2][16384],l[2];
int ges(int s,int j,int p)
{return s|((p>1)<<m)|((p>0)<<j);}
void work(int g,int sq,int sp,int w){int S=(sq<<m+1)|sp;(f[g][S]+=w)%=P;if(!v[g][S])v[g][S]=1,s[g][l[g]++]=S;return;
}
int main()
{freopen("grid.in","r",stdin);freopen("grid.out","w",stdout); scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);int g=0,MS=(1<<m+1)-1;memset(f,0,sizeof(f));memset(v,0,sizeof(v));l[1]=0;s[0][0]=0;l[0]=1;f[0][0]=1;for(int i=0;i<n;i++){for(int j=0,lim;j<m;j++){scanf("%d",&lim);g^=1;for(int p=0;p<l[g];p++)v[g][s[g][p]]=f[g][s[g][p]]=0;l[g]=0;for(int x=0;x<=4;x++){if(lim!=-1&&lim!=x)continue;for(int p=0;p<l[!g];p++){int S=s[!g][p],zq=x,zp=x;int sq=S>>m+1,sp=S-(sq<<m+1);int kq=(j?((sq>>j-1)&1):0),kp=(j?((sp>>j-1)&1):0);zq-=((sq>>m)&1)+((sq>>j)&1);kq-=((sq>>m)&1);zp-=((sp>>m)&1)+((sp>>j)&1);kp-=((sp>>m)&1);if(zq<0||zp<0)continue;sq&=MS^(1<<m)^(1<<j);sp&=MS^(1<<m)^(1<<j);for(int rq=0;rq<=kq;rq++)for(int rp=0;rp<=kp;rp++){if(zq<rq||zp<rp||zq-rq>2||zp-rp>2)continue;work(g,ges(sq^(rq<<j-1),j,zq-rq),ges(sp^(rp<<j-1),j,zp-rp),f[!g][S]);}}}}g^=1;for(int p=0;p<l[g];p++)v[g][s[g][p]]=f[g][s[g][p]]=0;l[g]=0;for(int p=0;p<l[!g];p++){int S=s[!g][p];int sq=S>>m+1,sp=S-(sq<<m+1);if(((sq>>m)&1)|((sp>>m)&1))continue;work(g,sq,sp,f[!g][S]);}}printf("%d\n",f[g][0]);}return 0;
}

YbtOJ-方格填写【插头dp】相关推荐

  1. CCF201409-5 拼图(100分)【插头DP+状态压缩】

    试题编号: 201409-5 试题名称: 拼图 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中,使得方格图正好被拼满 ...

  2. ac1412. 邮政货车(插头DP)

    题目 原题链接:点击这里 大致题意:求解n*4的方格中,哈密顿回路的数量 思路 表示的方法还是跟插头dp的左右表示法一样,这边(打表) 注意起始状态和终止状态的合法性 代码实现 因为这题里面嵌套了高精 ...

  3. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 924  Solved: 351 [Submit][S ...

  4. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...

  5. HDU4084 插头dp

    题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP或轮廓线,多加一维DP讨论就可以 注意插头DP状 ...

  6. POJ3133(插头dp)

    传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K       ...

  7. P3272 [SCOI2011]地板(插头DP)

    [题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...

  8. POJ 3133 Manhattan Wiring (插头DP)

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1110   Accepted: 634 D ...

  9. URAL1519 Formula 1 —— 插头DP

    题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB ...

  10. [集训队作业2018]小Z的礼物(min-max容斥,插头dp)

    传送门 这种求 "取到所有物品的期望时间" 的题一般都用 min−maxmin-maxmin−max容斥 解决: 设t(i,j)t(i,j)t(i,j)为取到格子(i,j)(i,j ...

最新文章

  1. 模拟文件上传(一):手动文件上传
  2. NoSQL分布式数据库的独家见解- Adam Fowler
  3. 37--计算一个字符串中每个字符出现次数
  4. maven配置之:<distributionManagement>snapshot快照库和release发布库
  5. MySQL存储过程 — 解析 XML 数据并实现插入操作
  6. java流家族_1.1.2 完整的流家族
  7. LeetCode之翻转二叉树以匹配先序遍历
  8. 第7章 特种文献检索
  9. Python加载失败
  10. leapftp 3.0.1使用教程,leapftp 3.0.1使用教程图解
  11. 计算机色彩知识调研(二):位深、Gamma值、标准色温和Display P3
  12. SD-WAN是怎么实现的?纯技术篇(上)Sdwan-Cheap
  13. Smart210学习记录-------内存初始化
  14. scrapy爬虫数据存入mysql数据库
  15. 五款轻量级的办公软件,界面简洁且无广告
  16. AI技术 | PIFuHD-由高清图片生成3D人物模型对BIM的启示
  17. 为什么网络钓鱼攻击仍然有利可图----以及如何阻止它
  18. 方孔分段的lisp_cad怎么把一条线直接分段
  19. 艺赛旗RPA离线识别普通验证码
  20. 小白终是踏上了这条不归路----小文的mysql学习笔记目录

热门文章

  1. 如何将手机投屏到电脑_手机如何投屏到电脑上?详细教程看这里,手机投屏
  2. echarts 时间曲线图_制作按时间每秒实时更新的echarts折线图
  3. python的所有库_Python 常用库
  4. 信息技术上册教案了解计算机,信息技术上册全册教案
  5. java8 垃圾 不同_【不同的Java垃圾回收器的比较】
  6. c语言查单词小程序,【附源码】小程序初窥之简单查单词
  7. 算法题目——使用最小花费爬楼梯(动态规划)
  8. [蓝桥杯][2014年第五届真题]兰顿蚂蚁-模拟
  9. C++string容器-插入和删除
  10. Shaolin HDU - 4585(map模板题)