UESTC 885 方老师买表 --状压DP
将方格的摆放分成两种:
1.水平摆放:此时所占的两个格子都记为1。
2.竖直摆放:此时底下那个格子记为1,上面那个记为0。
这样的话,每行都会有一个状态表示。
定义:dp[i][s]表示考虑已经填到第i行,这一行状态为s的方法数
转移:dp[i][s] = dp[i][s]+dp[i-1][s'] (s'为上一行的状态,当第i行和第i-1行能够满足条件时,进行转移)
先预处理出所有满足条件的第一行,然后从第二行开始转移。
最后答案为dp[n][(1<<m)-1].
当n<m时交换n和m可减小1<<m,即减少状态数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
#define ll long long
using namespace std;
#define N 2100 ll dp[][N];
int n,m; int FirstLine(int state)
{
int i=;
while(i<m)
{
if(state & (<<i)) //第i列为1,第i+1列也存在且必须为1
{
if(i < m-)
{
if(state & (<<(i+))) //第i+1列为1
i += ;
else
return ;
}
else
return ;
}
else
i++;
}
return ;
} int Can(int ka,int kb) //ka:这一行,kb:上一行
{
int i = ;
while(i<m)
{
if(ka & (<<i)) //这一行i列为1
{
if(kb & (<<i)) //如果上一行i列为1,则为两个水平块
{
if(i < m- && (ka & (<<(i+))) && (kb & (<<(i+))))
i += ;
else
return ;
}
else //上一行为0,竖着放的
i++;
}
else //这一行i列为0,上一行i列必须填充
{
if(kb & (<<i))
i++;
else
return ;
}
}
return ;
} int main()
{
int i,j,sa;
int state1,state2;
while(scanf("%d%d",&n,&m)!=EOF)
{
if((n*m)%)
{
puts("");
continue;
}
memset(dp,,sizeof(dp));
if(n < m)
swap(n,m);
int MAX = (<<m)-;
for(sa=;sa<=MAX;sa++)
{
if(FirstLine(sa)) //此状态可以作为第一行的状态
dp[][sa] = ;
}
for(i=;i<n;i++) //行递增
{
for(state1=;state1<=MAX;state1++)
{
for(state2=;state2<=MAX;state2++)
{
if(Can(state1,state2))
dp[i][state1] += dp[i-][state2];
}
}
}
printf("%lld\n",dp[n-][MAX]);
}
return ;
}
UESTC 885 方老师买表 --状压DP的更多相关文章
- UESTC_方老师买表 CDOJ 885
老师买表 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Stat ...
- 【AGC012E】 Camel and Oases ST表+状压dp
题目大意:一排点,两点间有距离. 初始你有一个行走值$v$,如果相邻两点距离不超过$v$你可以自由在这两点行走. 当$v$大于$0$时,你可以选择某一时刻突然飞到任意点,这样做后$v$会减半(下取整) ...
- UESTC 884 方老师的专题讲座 --数位DP
定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...
- UESTC 886 方老师金币堆 --合并石子DP
环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...
- 【bzoj5161】最长上升子序列 状压dp+打表
题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...
- 洛谷 P4484 - [BJWC2018]最长上升子序列(状压 dp+打表)
洛谷题面传送门 首先看到 LIS 我们可以想到它的 \(\infty\) 种求法(bushi),但是对于此题而言,既然题目出这样一个数据范围,硬要暴搜过去也不太现实,因此我们需想到用某种奇奇怪怪的方式 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- 算法复习——状压dp
状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...
- NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]
我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS ...
随机推荐
- Exchange Server 2013 一步步安装图解
前言: 这是一份为Exchange菜鸟准备的2013版本安装文档,安装环境为Windows Server 2012 DataCenter 版本,在安装之前,我对安装Exchange也是处于一无所知的状 ...
- Sizing and Capacity Planning for SharePoint 2013 - Resources
http://blogs.msdn.com/b/sanjaynarang/archive/2013/04/06/sizing-and-capacity-planning-for-sharepoint- ...
- 2015第18本:从0到1,ZERO to ONE, Notes on startups, or how to build the future
<从0到1>中文版的副标题是”开创商业与未来的秘密“,题目大得吓人,英文副标题就谨慎了许多:Notes on startups, or how to build the future. 全 ...
- 基本完成了一个SEGY扫描程序
利用Seismic.NET编写了一个SEG-Y文件的扫描程序,可以自动判断道头字中主测线号.横测线号.X坐标和Y坐标的位置,自动快速扫描地震数据体中的拐点坐标.10GB多的数据体几十秒全部扫描完成! ...
- Caused by: java.lang.UnsupportedOperationException
对Arrays.asList()返回的List进行操作之后报错Caused by: java.lang.UnsupportedOperationException 让我们来看一下Arrays.asLi ...
- windows 我的电脑右键 无法打开管理窗口
保存成reg文件,执行一下就好了. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069- ...
- IOS酷炫的下拉刷新链接收集
https://github.com/MartinRGB/Replace-iOS https://github.com/coolbeet/CBStoreHouseRefreshControl http ...
- IOS组件绑定无效错误
报错的原因:界面按钮事件没有绑定到源代码或者相关的代码被注释了.比如你的button组件以及绑定到IBOutlet,但是viewcontrol.m上没有相关的代码,就会出现异常.
- virtualbox 安装 虚拟机的时候报错不能创建新任务
找到原因是因为自己的windows是破解的, 找到C:\Windows\system32\uxtheme.dll这个文件,我的破解的windows在这里自带了一个uxtheme.dll.backup的 ...
- OOD沉思录 --- 类和对象的关系 --- 包含关系4
4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...