BZOJ5205 [CodePlus 2018 3 月赛]白金元首与莫斯科
传送门
emm在雅礼集训的时候听到的一道题 上来就觉得是插头dp 最后果然是轮廓线状压233
我们简化一下题意。 有一个n*m的网格,每个格子是空地或障碍物,询问把每一个空地看成障碍物的情况下,用1*2的骨牌覆盖(可以留有空地)的方案数 对1e9+7取模 bzoj和洛咕题面都挂了233
我们发现留有空地就很烦,所以我们可以把空地看成1*1的骨牌,这样的话我们统计的方案数就是用1*1的骨牌和1*2的骨牌完全覆盖网格的方案数。
骨牌覆盖! ——》轮廓线状压!
但是我们发现如果对于每个格子直接计算的话 时间复杂度是O(n^3*2^m) 根本无法承受
所以我们考虑另一种做法 我们可以选择对前后缀进行合并这样的话复杂度就降到了O(n^2*2^m)
我们考虑如何对前后缀进行合并 即什么样的两条轮廓线是合法的

对应红色的格子作为我们的合并的格子的话 首先要求它上下两个格子已经被覆盖过了 然后就是上下对应的蓝绿格子应该状态相同 这样才能竖着填满棋盘(我们现在只考虑竖着因为横向的覆盖是在轮廓线dp的时候已经讨论过了)
所以我们对前后分别进行一次轮廓线dp(讨论横着放1*2竖着放1*2放1*1和不放) 然后最后统计答案的时候进行合并即可
附代码。(哦对bzoj卡空间只能开到1<<17不过也够了233)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mdn 1000000007
using namespace std;
int f[18][18][1<<17],g[18][18][1<<17];
int bit[18],n,m,top;
int mp[18][18];
void add(int &x,int y){x=(x+y)%mdn;}
void work()
{
//int top=(1<<m)-1;
f[1][1][top]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int x=i,y=j+1;
if(j==m) x=i+1,y=1;
if(x>n) continue;
for(int st=0;st<=top;st++)
if(f[i][j][st])
{
int tmp=f[i][j][st];
if((st&bit[j])==0&&mp[i][j]) continue;
if((st&bit[j])==0)
{
add(f[x][y][st|bit[j]],tmp);
continue;
}
if(mp[i][j]) add(f[x][y][st],tmp);
else
{
add(f[x][y][st],tmp);
add(f[x][y][st^bit[j]],tmp);
if(j>1&&(st&bit[j-1])==0) add(f[x][y][st|bit[j-1]],tmp);
}
}
}
g[n][m][top]=1;
for(int i=n;i;i--)
for(int j=m;j;j--)
{
int x=i,y=j-1;
if(j==1) x=i-1,y=m;
if(x<1) continue;
for(int st=0;st<=top;st++)
if(g[i][j][st])
{
int tmp=g[i][j][st];
if((st&bit[j])==0&&mp[i][j]) continue;
//printf("%d %d %d %d\n",i,j,st,g[i][j][st]);
if((st&bit[j])==0)
{
add(g[x][y][st|bit[j]],tmp);
continue;
}
if(mp[i][j]) add(g[x][y][st],tmp);
else
{
add(g[x][y][st],tmp);
add(g[x][y][st^bit[j]],tmp);
if(j<m&&(st&bit[j+1])==0) add(g[x][y][st|bit[j+1]],tmp);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
bit[1]=1;top=(1<<m)-1;
for(int i=2;i<=m;i++) bit[i]=bit[i-1]<<1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
work();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j])
{
printf("0 ");
continue;
}
int ans=0;
for(int s=0;s<=top;s++)
{
if(s&bit[j])
add(ans,(ll)f[i][j][s]*g[i][j][s]%mdn);
//printf("%d %d %d %d\n",i,j,f[i][j][s],g[i][j][s]);
}
printf("%d ",ans);
}
printf("\n");
}
return 0;
}
BZOJ5205 [CodePlus 2018 3 月赛]白金元首与莫斯科的更多相关文章
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
- bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)
5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...
- 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯
[题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...
- 「CodePlus 2018 3 月赛」白金元首与莫斯科
$n \leq 17,m \leq 17$,$n*m$的01矩形,对每一个0问:当他单独变成1之后,在其他0处放多米诺牌(不一定放满,可以不放)的方案数.膜$1e9+7$. 直接$dp$是$n^42^ ...
- 「CodePlus 2018 3 月赛」白金元首与克劳德斯
所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计
link 题意: A和B玩游戏,每轮A赢的概率为p.现在有T组询问,已知A赢了n轮输了m轮,没有平局,赢一局A得分+1,输一局得分-1,问A得分期望值? $n+m,T\leq 2.5\times 10 ...
- 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS
[题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...
- bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计
Description 大家的好朋友小 L 来到了博弈的世界.Alice 和 Bob 在玩一个双人游戏.每一轮中,Alice 有 p 的概率胜利,1 -p 的概率失败,不会出现平局.双方初始时各有 0 ...
随机推荐
- 【leetcode】726. Number of Atoms
题目如下: 解题思路:我用的是递归的方法,每次找出与第一个')'匹配的'('计算atom的数量后去除括号,只到分子式中没有括号为止.例如 "K4(ON(SO3)2)2" -> ...
- Linux任务计划at
Linux任务计划at 一Linux任务计划介绍 Linux任务计划.周期性任务执行at:未来的某时间点执行一次任务batch:系统自行选择空闲时间去执行此处指定的任务cron:周期性运行某任务 二a ...
- php ord()函数 语法
php ord()函数 语法 作用:返回字符串的首个字符的 ASCII 值.直线电机生产厂家 语法:ord(string) 参数: 参数 描述 string 必须,要从中获得ASCII值的字符串 说明 ...
- linux0.11内核源码——进程各状态切换的跟踪
准备工作 1.进程的状态有五种:新建(N),就绪或等待(J),睡眠或阻塞(W),运行(R),退出(E),其实还有个僵尸进程,这里先忽略 2.编写一个样本程序process.c,里面实现了一个函数 /* ...
- 【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
题意:我们称一个字符串为周驿东串当且仅当重排它的字符可以组成一个回文串. 给出一个n个点的有根树,根为1,每条边上有一个从a到v的字符,求每个点的子树中所有简单路径可以组成的周驿东串中的最长长度. n ...
- python常用安装
pip install CalledProcessErrorpip install Popenpip install runpip install requests
- LOJ 3092 「BJOI2019」排兵布阵 ——DP
题目:https://loj.ac/problem/3092 同一个人的不同城堡之间没有什么联系,只是和<=m.所以对每个城堡的 s 个值排序,做一个 f[ i ][ j ] 表示第 i 个城堡 ...
- JS基础入门篇(六)— 数据类型
1.数据类型 数据类型:我感觉就是对数据的种类进行分类.就好比把人分为儿童,青少年,中年,老年一样. 基础数据类型: Number(数字),String(字符串),Null(空),Undefined( ...
- 前端每日实战:99# 视频演示如何用纯 CSS 创作一个过山车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KBxYZg/ 可交互视频 此视频是 ...
- docstoc对Scribd的威胁比SlideShare还要大。
docstoc,这是在TechCrunch40互联网交流会上崭露头角的个性化服务.docstoc为用户提供了在线存储.分享以及交流文档的互联网服务.与Scribd相同的是,除了文档分享功能以外,doc ...