「CodePlus 2018 3 月赛」白金元首与莫斯科
$n \leq 17,m \leq 17$,$n*m$的01矩形,对每一个0问:当他单独变成1之后,在其他0处放多米诺牌(不一定放满,可以不放)的方案数。膜$1e9+7$。
直接$dp$是$n^42^n$,很难受。这种整体挖一块的东西可以用拼接法,就是用那一块前的$dp$值和那一块后的$dp$值计算答案。
$f(i,j,k)$--从$(1,1)$到$(i,j)$,在$(i,j)$前面$m$个格子状态$k$的方案数,$g(i,j,k)$--从$(n,m)$到$(i,j)$,在$(i,j)$后面$m$个格子状态$k$的方案数。状态$k$中1表示这一位是障碍或放了牌,0表示还没放。
然后来看$f(i,j,k)$和$g(i,j,k)$怎么合并出$(i,j)$的答案。画画图可以发现,$f(i,j,p)$和$g(i,j,q)$可以合并,除非他们空出的地方刚好对齐可以放竖的多米诺,表现为:$p,q$的第一位都是1,然后$p$和$q$的后$m-1$位恰好相反。因此可以$O(2^m)$算出一个点的答案。总复杂度$n^22^n$。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<vector>
#include<algorithm>
//#include<iostream>
//#include<assert.h>
using namespace std; int n,m;
const int mod=1e9+;
int g[][][],f[][],cur;
bool mp[][]; int rev(int x) {int ans=x&; for (int i=;i<m;i++) ans|=((x>>i)&)<<(m-i); return ans;} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) for (int j=,x;j<=m;j++) scanf("%d",&x),mp[i][j]=x; g[n][m][(<<m)-]=;
for (int i=n;i;i--)
for (int j=m;j;j--)
{
int ni=i,nj=j-; if (nj==) ni=i-,nj=m; if (ni==) break;
for (int k=,nk;k<(<<m);k++) if (g[i][j][k])
{
if ((k&)== && i<n && !mp[i+][j])
{if (!mp[i][j]) {nk=(k>>)|(<<(m-)); g[ni][nj][nk]+=g[i][j][k],g[ni][nj][nk]-=g[ni][nj][nk]>=mod?mod:;}}
else
{
nk=(k>>)|(<<(m-)); g[ni][nj][nk]+=g[i][j][k],g[ni][nj][nk]-=g[ni][nj][nk]>=mod?mod:;
if (!mp[i][j])
{
nk=(k>>); g[ni][nj][nk]+=g[i][j][k],g[ni][nj][nk]-=g[ni][nj][nk]>=mod?mod:;
if (j<m && ((k>>(m-))&)== && !mp[i][j+])
{nk=(k>>)|(<<(m-))|(<<(m-)); g[ni][nj][nk]+=g[i][j][k],g[ni][nj][nk]-=g[ni][nj][nk]>=mod?mod:;}
}
}
}
} cur=; f[][(<<m)-]=;
for (int i=;i<=n;i++,puts(""))
for (int j=;j<=m;j++)
{
int ans=;
if (!mp[i][j])
for (int k=;k<(<<m);k+=) ans+=1ll*f[cur][k]*g[i][j][rev(k)]%mod,ans-=ans>=mod?mod:;
printf("%d ",ans);
int ni=i,nj=j+; if (nj>m) ni++,nj=; if (ni>n) break;
for (int k=,nk;k<(<<m);k++) if (f[cur][k])
{
if ((k&)== && i> && !mp[i-][j])
{if (!mp[i][j]) {nk=(k>>)|(<<(m-)); f[cur^][nk]+=f[cur][k],f[cur^][nk]-=f[cur^][nk]>=mod?mod:;}}
else
{
nk=(k>>)|(<<(m-)); f[cur^][nk]+=f[cur][k],f[cur^][nk]-=f[cur^][nk]>=mod?mod:;
if (!mp[i][j])
{
nk=(k>>); f[cur^][nk]+=f[cur][k],f[cur^][nk]-=f[cur^][nk]>=mod?mod:;
if (j> && ((k>>(m-))&)== && !mp[i][j-])
{nk=(k>>)|(<<(m-))|(<<(m-)); f[cur^][nk]+=f[cur][k],f[cur^][nk]-=f[cur^][nk]>=mod?mod:;}
}
}
f[cur][k]=;
}
cur^=;
}
return ;
}
话说这代码调了好久的。。是个小错误,以后调代码得静下心了。
「CodePlus 2018 3 月赛」白金元首与莫斯科的更多相关文章
- 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯
[题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...
- 「CodePlus 2018 3 月赛」白金元首与克劳德斯
所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞
[题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...
- 「CodePlus 2017 12 月赛」白金元首与独舞
description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...
- 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞
n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...
- loj6259「CodePlus 2017 12 月赛」白金元首与独舞
分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
- @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...
随机推荐
- [转]八款开源Android游戏引擎
八款开源Android游戏引擎 1.Angle Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发.该引擎全部用Java代码编写,并且可以根 ...
- wxwidgets编译及环境配置
wxwidgets编译及环境配置 安装步骤: 到www.CodeBlocks.org下载并安装CodeBlocks,最好下载MinGW版本的,可以省掉安装和配置GCC的麻烦. 到www.wxWidge ...
- react中的setState的使用和深入理解
前端框架从MVC过渡到MVVM.从DOM操作到数据驱动,一直在不断的进步着,提升着, angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好 ...
- django 2.0 + pycharm2017 出现的问题
在创建完成app之后,在models文件里创建两个类:BlogType , Blog, 创建超级用户,注册admin,在登陆admin之后发现,发现 BlogType , Blog,并没有导入到adm ...
- Spring启动流程—源码解读
https://blog.csdn.net/yangliuhbhd/article/details/80790761 Spring的AbstractApplicationContext的refresh ...
- codevs 数字三角形集结
添在前面的一句话:初学DP,若有错误,请指出,不能误人子弟,欢迎大家提出意见.水平不高,博客写的比较粗糙,代码也挺丑,请见谅. 最原始的数字三角形: 1220 数字三角形 时间限制: 1 s 空间 ...
- HDU-2544-最短路(Bellman-Ford)
Bellman-Ford算法是一个时间复杂度很高,但是它可以用来判断负环 负环就是上面的图,那个环的整体值小于零了,所以就是负环. 我们用Bellman-Ford算法进行更新,打一个表出来: k a ...
- 【数位dp】bzoj1799: [Ahoi2009]self 同类分布
各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...
- Linux菜鸟起飞之路【四】绝对路径、相对路径及常用目录
一.绝对路径与相对路径 Linux操作系统中存在着两种路径:绝对路径和相对路径.我们在访问文件或文件夹的时候,其实都是通过路径来操作的.两种路径在实际操作中能起到同等的作用. 在开始具体介绍之前,我们 ...
- Python中的socket网络编程(TCP/IP,UDP)讲解
在网络编程中的一个基本组件就是套接字(socket).套接字基本上是两个端点的程序之间的"信息通道".程序可能分布在不同的计算机上,通过套接字互相发送信息.套接字包括两个:服务器套 ...