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 ...
随机推荐
- poi 导出 excel
private void exportAssetExcel(HttpServletRequest request, HttpServletResponse response) throws IOExc ...
- 小白初学ABP框架,着实累啊
这几天在学习ABP相关的知识AutoMapper ,AngularJS,Less,DI(dependencyInjection),EntityFramework code first以及相关NuGet ...
- mysql 5.6.33发布
2016-09-06,mysql 5.6.33社区版发布,修复的bug越发减少,而且基本上都是较少使用的特性.
- DOJO官方API翻译或解读-dojo/_base/lang --hitch()
hitch() hitch() 是一个函数,会在给定的上下中执行给定一个执行函数.hitch允许你去控制一个函数如何执行,往往在异步操作中起作用. 我们常常会写出这样的代码:(博主:这个代码意图在&q ...
- 详解Paint的setMaskFilter(MaskFilter maskfilter)
一.setMaskFilter(MaskFilter maskfilter) setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处 ...
- hadoop实战–搭建eclipse开发环境及编写Hello World
原创文章,转载请注明: 转载自工学1号馆 欢迎关注我的个人博客:www.wuyudong.com, 更多云计算与大数据的精彩文章 1.在eclise中安装hadoop的插件并配置 在上篇文章<编 ...
- Stooge排序与Bogo排序算法
本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址. Stooge排序算法 Stooge ...
- NavigationController的使用整理
1.设置NavigationBar的背景色: self.navigationController.navigationBar.barTintColor = [UIColor redColor]; 2. ...
- 可展开的列表组件——ExpandableListView深入解析
可展开的列表组件--ExpandableListView深入解析 一.知识点 1.ExpandableListView常用XML属性 2.ExpandableListView继承BaseExpanda ...
- C++中const用法总结
1修饰变量/指针 注意以下几种修饰的区别: (1)const int * a; (2)int const *a; (3)int * const b; (4)int const* const c; 其中 ...