第一道轮廓线dp,因为不会轮廓线dp我们在南京区域赛的时候没有拿到银,可见知识点的欠缺是我薄弱的环节。

题目就是要你用1*2的多米诺骨排填充一个大小n*m(n,m<=11)的棋盘,问填满它有多少不同的方法。 一个可行的解法就是轮廓线dp。 假设我们从上往下,从左往右去填,那么我们会发现,假如我们当前填的是(i,j)格的时候,在它前面的(i',j')其实是已经确定一定填了的,所以实际上没有填的时候处于轮廓线的部分,在这里没有具体

1 1 1 1
1 1 x x
x x    
       

如上图,当我们填红色的x那一格的时候,前面的(i',j')必然为1,而实际上我们要考虑的是x 的那一部分,这一部分就是所谓的轮廓线,x的取值可能是不确定的,所以我们可以用位压缩表示出xxxx的状态。转移的时候根据的就是三种情况,1是红色的x 已经填了,这个时候不用放,相应的转移情况,还有就是红色的x没填,它可以打横放以及打竖放。

因为用到位压缩,所以要求的是棋盘一定具有窄边框的特性,就是有一维上必须是10左右,由于每一格是一个阶段,每次转移2^m种状态,每种状态转移的复杂度是O(1),所以总体的复杂度是O(n*m*2^m)。

还有一些变形是棋盘上本身就已经有一些障碍,这个只需要在转移的时候多加注意即可,我后面也会做一道试试。

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
#define ll long long
using namespace std; int n, m;
ll dp[2][1 << 12]; // 二维滚动数组 int main()
{
while (cin >> n >> m &&(n||m))
{
memset(dp, 0, sizeof(dp));
ll *cur, *next;
cur = dp[0]; next = dp[1];
cur[0] = 1;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
memset(dp[(i*m+j+1)&1], 0, sizeof(dp[(i*m+j+1)&1]));
cur = dp[(i*m + j) & 1]; next = dp[(i*m + j + 1) & 1];
for (int k = 0; k < 1 << m; k++){
// 如果已经放了,那就直接转移
if ((k >> j) & 1){
next[k & ~(1 << j)] += cur[k];
}
else{
// 尝试横放
if (j + 1 < m && !(k >> (j + 1) & 1)){
next[k | 1 << (j + 1)] += cur[k];
}
// 尝试竖放
if (i + 1 < n){
next[k | 1 << j] += cur[k];
}
}
}
}
}
printf("%lld\n", next[0]);
}
return 0;
}

POJ2411 Mondriaan's Dream 轮廓线dp的更多相关文章

  1. Mondriaan's Dream 轮廓线DP 状压

    Mondriaan's Dream 题目链接 Problem Description Squares and rectangles fascinated the famous Dutch painte ...

  2. poj 2411 Mondriaan's Dream 轮廓线dp

    题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...

  3. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17203   Accepted: 991 ...

  4. $POJ2411\ Mondriaan's\ Dream$ 状压+轮廓线$dp$

    传送门 Sol 首先状压大概是很容易想到的 一般的做法大概就是枚举每种状态然后判断转移 但是这里其实可以轮廓线dp 也就是从上到下,从左到右地放方块 假设我们现在已经放到了$(i,j)$这个位置 那么 ...

  5. POJ2411 Mondriaan's Dream 题解 轮廓线DP

    题目链接:http://poj.org/problem?id=2411 题目大意 给你一个 \(n \times m (1 \le n,m \le 11)\) 的矩阵,你需要用若干 \(1 \time ...

  6. poj2411 Mondriaan's Dream【状压DP】

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20822   Accepted: 117 ...

  7. [Poj2411]Mondriaan's Dream(状压dp)(插头dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18096   Accepted: 103 ...

  8. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  9. POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream

    炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...

随机推荐

  1. 常见web服务器错误

    参考地址:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5     10 Status Code Definitions ...

  2. 支持向量机 support vector machine

    SVM(support Vector machine) (1) SVM(Support Vector Machine)是从瓦普尼克(Vapnik)的统计学习理论发展而来的,主要针对小样本数据进行学习. ...

  3. php获取网页中图片并保存到本地的代码

    php获取网页中图片并保存到本地的代码,将网页中图片保存本地文件夹: <?php /** * 获取网页中图片,并保存至本地 * by www.jbxue.com */ header(" ...

  4. apache http server 局域网无法访问

    apache 本地配置完成测试成功,但局域网内无法访问. 1.主要是本本地的防火墙设置有关,修改防火墙设置就成了 控制面板->系统和安全->Windows 防火墙->允许程序通过Wi ...

  5. KMP算法的理解

    ---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法 ...

  6. 【面试虐菜】—— Jboss调优

    吐血整理了以前Jboss以及JVM在生产环境下的调优参数,各种不同的案例,都是来自网友杜撰.整合后,希望对广大使用jboss作为生产应用服务器的朋友有所帮助. JBOSS参数调优 配置deploy/j ...

  7. VS2010调试入门指南

    1 导言 在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间.通常,debug是指发现缺 ...

  8. Oralce常用维护命令

    1. sqlplus远程连接 方式一:简易连接,不用进行网络配置,其实就是tnsname.ora文件,但只支持oracle10G以上.命令:sqlplus 用户名/密码@ip地址[:端口]/servi ...

  9. 日志文件切割服务logrotate配置及crontab定时任务的使用

    1.下载logrotate 在Fedora和CentOS安装 yum install logrotate crontabs Debian和Ubuntu上 apt-get install logrota ...

  10. ASP.NET Web – AJAX 回送

    使用UpdatePanel时要一起使用的控件是ScriptManager.ScriptManager类加载了包含几个功能的JavaScript函数.也可以使用这个类加载自己定制脚本.ScriptMan ...