P3170-[CQOI2015]标识设计【插头dp】
正题
题目链接:https://www.luogu.com.cn/problem/P3170
题目大意
给出n∗mn*mn∗m的网格上有一些障碍,要求用三个LLL形(高宽随意,不能退化成线段/点)覆盖格子且LLL形之间不能重叠。
求覆盖方案(每个LLL形相同)
2≤n,m≤302\leq n,m\leq 302≤n,m≤30
解题思路
一道比模板要简单的插头dpdpdp?(当然我依旧不会)
先是考虑插头的状态,每个LLL形的话,一个还没有涂完的LLL形可能是右插头或者下插头,因为只有三个所以最多只会有333个下插头,这样的状态数是Cm3C_m^3Cm3的,在500050005000以内。
把这些状态压缩起来,然后设fx,y,s,k,0/1f_{x,y,s,k,0/1}fx,y,s,k,0/1表示现在dpdpdp到格子(x,y)(x,y)(x,y),目前下插头状态为sss,已经插入了kkk个LLL形(作为下插头),目前有没有右插头。
转移的话就很简单了,如果下一个格子有障碍那它上面就不能有插头,如果这个格子上面有插头就分为结束这个下插头变为一个右插头或者不结束。
如果这个格子有右插头那么就不能有上插头。
没有这些限制就能够开一个下插头。
需要注意到行尾的时候可能会还有右插头,在最右边加一列障碍就好了。
时间复杂度是O(nmCm3)O(nmC_{m}^3)O(nmCm3)的
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=32,M=5100;
ll n,m,cnt,f[N][M][4][2];
ll id[N][N][N],pi[M],pj[M],pk[M];
bool v[N][N];char s[N];
void init(){for(ll i=0;i<=m;i++)for(ll j=i?(i+1):0;j<=m;j++)for(ll k=j?(j+1):0;k<=m;k++){id[i][j][k]=++cnt;pi[cnt]=i;pj[cnt]=j;pk[cnt]=k;}ll p[3];for(ll i=0;i<=m;i++)for(ll j=0;j<=m;j++)for(ll k=0;k<=m;k++){p[0]=i;p[1]=j;p[2]=k;sort(p,p+3);id[i][j][k]=id[p[0]][p[1]][p[2]];}return;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){scanf("%s",s+1);for(ll j=1;j<=m;j++)if(s[j]=='#')v[i][j]=1;}m++;for(ll i=1;i<=n;i++)v[i][m]=1;ll g=0;f[0][1][0][0]=1;init();for(ll p=1;p<=n*m;p++){ll x=(p-1)/m+1,y=(p-1)%m+1;g^=1;memset(f[g],0,sizeof(f[g]));for(ll s=1;s<=cnt;s++){ll a=pi[s],b=pj[s],c=pk[s];for(ll k=0;k<=3;k++){if(f[!g][s][k][0]){if(!v[x][y]){f[g][s][k][0]+=f[!g][s][k][0];if(y==a)f[g][id[0][b][c]][k][1]+=f[!g][s][k][0];else if(y==b)f[g][id[a][0][c]][k][1]+=f[!g][s][k][0];else if(y==c)f[g][id[a][b][0]][k][1]+=f[!g][s][k][0];else if(k<3) f[g][id[y][b][c]][k+1][0]+=f[!g][s][k][0];}else if(y!=a&&y!=b&&y!=c)f[g][s][k][0]+=f[!g][s][k][0];}if(f[!g][s][k][1]&&!v[x][y]&&y!=a&&y!=b&&y!=c){f[g][s][k][1]+=f[!g][s][k][1];f[g][s][k][0]+=f[!g][s][k][1];}}}}printf("%lld\n",f[g][1][3][0]);return 0;
}
P3170-[CQOI2015]标识设计【插头dp】相关推荐
- 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 ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...
- HDU4084 插头dp
题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法 思路:插头DP或轮廓线,多加一维DP讨论就可以 注意插头DP状 ...
- POJ3133(插头dp)
传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K ...
- P3272 [SCOI2011]地板(插头DP)
[题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...
- POJ 3133 Manhattan Wiring (插头DP)
Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1110 Accepted: 634 D ...
- URAL1519 Formula 1 —— 插头DP
题目链接:https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 second Memory limit: 64 MB ...
- [集训队作业2018]小Z的礼物(min-max容斥,插头dp)
传送门 这种求 "取到所有物品的期望时间" 的题一般都用 min−maxmin-maxmin−max容斥 解决: 设t(i,j)t(i,j)t(i,j)为取到格子(i,j)(i,j ...
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
[BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...
- Ural 1519. Formula 1 优美的插头DP
今天早上学了插头DP的思想和最基础的应用,中午就开始敲了,岐哥说第一次写不要看别人代码,利用自己的理解一点点得写出来,这样才锻炼代码能力!于是下午慢慢地构思轮廓,一点点地敲出主体代码,其实是很磨蹭的, ...
最新文章
- Selenium 1.0的历史及工作原理
- php vendor 删除,yii2我删除了vendor目录,然后重新composer install composer update就不行了。。。...
- 分享:bbed修改数据文件头推进scn与其他数据文件相同
- python列表排序后返回索引排序
- 谷歌出现新冠肺炎确诊病例,限制员工出行;比尔·盖茨:可能成百年不遇的大流行病...
- php实现 明明的随机数
- 【2018年更新】Sublime text 3安装教程(Linux版本--Ubuntu)
- mysql 代码执行时间_mysql 显示SQL语句执行时间的代码
- MINIGUI常见错误集及解决方法
- [译]5 Mac OS X RSS Readers Worth Giving a Shot
- OpenCV_ cv2.imshow()
- asp.net hessian + android hessdroid
- webpack5学习与实战-(五)-直接加载资源
- 盘点:2022年10款比较火的项目管理软件
- Python BS4 星巴克界面图片报错, tfp = open(filename, ‘wb‘) FileNotFoundError: [Errno 2] No such file or
- 【c语言】高级篇学习笔记
- 手机APP远程控制树莓派
- 详解数据仓库建设体系
- 从秋香,芳娜到不嫁国人的女大学生
- Tessellation on Any Budget
热门文章
- java enum优点_你需要关注的 Java Enum 枚举的几个细节
- node 16位 转24位_同时将24位和32位BMP图像顺时针旋转90度
- java前补零工具类_java生成编码工具类,不足补0
- idea报错Class not found (在target中没有生成对应的class文件)
- 7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗
- python函数参数那些事,关键字参数与位置参数
- 『软件工程12』软件工程实践方法——软件测试
- linux可疑程序,linux可疑程序追踪
- [C++STL]string容器用法介绍
- [蓝桥杯2015决赛]五星填数-枚举+数论