题目链接:https://vjudge.net/problem/UVA-11270

题意:

用2*1的骨牌填满n*m大小的棋盘,问有多少种放置方式。

题解:

骨牌类的插头DP。

1.由于只需要记录轮廓线上m个位置的放置情况(0或1),且m<=10,2^10 = 1024,故可以用二进制对轮廓线的信息进行压缩。

2.二进制中,第0为代表着当前轮廓线位于第0列的位置的放置情况,以此类推。

3.具体情况分析,设当前格子为a[i][j]:

1) 不放置:前提条件为上面的位置a[i-1][j]已经放置了骨牌。原因:如果上面的位置为空,且这次又不放,那么往后就没有机会填补这个空缺了。

2) 往上放:前提条件为上面的位置a[i-1][j]没有放置骨牌。原因显而易见。

3) 往左放:前提条件为上面的位置a[i-1][j]放置了骨牌,且左边的位置a[i][j-1]没有放置骨牌。原因:情况1)和情况2)的综合。

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = ; int n, m, cur;
LL dp[][<<MAXN]; int main()
{
while(scanf("%d%d", &n,&m)!=EOF)
{
if(n<m) swap(n, m);
memset(dp, , sizeof(dp)); cur = ;
dp[][(<<m)-] = ; //初始状态,第一个格子的轮廓线上都有插头,所以就防止了往外放
for(int i = ; i<n; i++)
for(int j = ; j<m; j++)
{
cur ^= ;
memset(dp[cur], , sizeof(dp[cur]));
for(int s = ; s<(<<m); s++) //由于有m个插头,而插头的编号从0开始,故最大状态为(1<<m)-1。
{
//枚举的是上一个格子的所有状态,即当前格子的轮廓线
int up = <<j; //位于第j列的插头,即上插头
int left = <<(j-); //位于第j-1列的插头, 即左插头
bool hav_up = s&up;
bool hav_left = s&left;
if( hav_up ) //不放置,前提是上插头存在
dp[cur][s^up] += dp[cur^][s]; if( i!= && !hav_up) //往上边放,前提是上插头不存在
dp[cur][s^up] += dp[cur^][s]; if( j!= && hav_up && !hav_left ) //往左边放,前提是上插头存在且左插头不存在
dp[cur][s^left] += dp[cur^][s];
}
} printf("%lld\n", dp[cur][(<<m)-]);
}
}

UVA11270 Tiling Dominoes —— 插头DP的更多相关文章

  1. uva 11270 - Tiling Dominoes(插头dp)

    题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...

  2. UVA11270 Tiling Dominoes

    \(\color{#0066ff}{ 题目描述 }\) 给定一个m×n的矩形网格,用1×2多米诺骨牌完全平铺. 请注意,即使一个平铺的旋转与另一个平铺相匹配,它们仍算作不同的平铺. 下面显示了一个平铺 ...

  3. UVA11270 Tiling Dominoes(轮廓线动态规划)

    轮廓线动态规划是一种基于状态压缩解决和连通性相关的问题的动态规划方法 这道题是轮廓线动态规划的模板 讲解可以看lrj的蓝书 代码 #include <cstdio> #include &l ...

  4. 插头dp

    插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...

  5. HDU 4113 Construct the Great Wall(插头dp)

    好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...

  6. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  7. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  8. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

  9. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

随机推荐

  1. 【HDOJ6228】Tree(树)

    题意:有一棵n个点的树,在树上的点涂色,每个点涂一种颜色,一共可以涂k种颜色, 然后把同一种颜色(比如说x)的点用最优方案连起来,在连线的边涂上x颜色,问涂k次的边最多有几条 k<=500 si ...

  2. grequests----golang的requests库

    github.com/levigross/grequests: A Go "clone" of the great and famous Requests library 特点: ...

  3. hdu4619 / 最大独立集

    题意,一个矩阵,上面可以横放或者竖着放骨牌(1X2)保证横的与横的不重叠,竖的和竖的不重叠,求拿掉最小的牌,使所有的都不重叠. 分析:一看,不重叠就是没有边,拿最少,就是留最多,最大独立集啊!二分图, ...

  4. 2017-10-28-morning-清北模拟赛

    T1 立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是 ...

  5. Codechef Yet another cute girl

    题意大概就是让你求一下[L,R]中的约数个数是素数的数的个数. 其中1<=L<=R<=1e12,R-L<=1e6. 然后我写了两种做法,第一种是可以直接搞出来L-R的约数个数, ...

  6. 【面试 struts2】【第三篇】struts2的问题

    1.struts2的工作流程 1>客户端浏览器发出HTTP请求. 2>根据web.xml配置,该请求被FilterDispatcher接收 3>根据struts.xml配置,找到需要 ...

  7. iOS的应用程序实现之间的内容分享

    前言 我们在iOS的平台上想要实现不同应用之间的内容分享一般有几种常用方式: 一种第的英文通过AirDrop实现不同设备的应用之间文档和数据的分享; 第二种是给每个应用程序定义一个URL方案,通过访问 ...

  8. Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框

    Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉 ...

  9. C# - CLR

     The Common Language Runtime (CLR), the virtual-machine component of Microsoft's .NET framework, m ...

  10. poj2595(凸包)

    Min-Max Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2192   Accepted: 502 Descriptio ...