POJ 2411 插头DP
//插头DP,算是广义路径的吧。
/*
我是这样想的,定义填数的为0,未填的为1.然后,初始自然是(0,0).我还定义了整个棋盘的状态,不知是否多此一举。
这样,把轮廓线上的格子状态记录。当(I,J)上方的格子为空,必定要填一个竖的。当左边格子为空,当前可填一个横的,也可不填。
当左边格子不为空,当前格子必为空。。。AC.
*/ #include <iostream>
#include <cstdio>
using namespace std;
int n,m;
int code[];
const int MAXL=;
const int MAXM=;
struct HASHMAP{
int hash[MAXL],next[MAXM];
__int64 f[MAXM]; int state[MAXM],alst[MAXM];
int size;
void init(){
size=;
memset(hash,-,sizeof(hash));
}
void push(int st,__int64 ans,int als){
int h=st%MAXL;
for(int i=hash[h];i!=-;i=next[i]){
if(state[i]==st){
f[i]+=ans;
return ;
}
}
f[size]=ans;
state[size]=st;
alst[size]=als;
next[size]=hash[h];
hash[h]=size++;
}
}hm[]; void decode(int st){
for(int i=;i<=m;i++){
code[i]=(st&);
st=(st>>);
}
} int encode(){
int st=; int i;
for(i=m;i>;i--){
st=(st|code[i]);
st=(st<<);
}
st=(st|code[i]);
return st;
} void dp(int i,int j,int cur){
for(int e=;e<hm[cur].size;e++){
decode(hm[cur].state[e]);
int als=hm[cur].alst[e];
if(code[j]==){
code[j]=; als--;
hm[cur^].push(encode(),hm[cur].f[e],als);
}
else{
if(code[j-]==){
code[j]=;
hm[cur^].push(encode(),hm[cur].f[e],als+);
code[j]=code[j-]=;
hm[cur^].push(encode(),hm[cur].f[e],als-);
}
else{
code[j]=;
hm[cur^].push(encode(),hm[cur].f[e],als+);
}
}
}
} int main(){
int i,j;
while(scanf("%d%d",&n,&m)!=EOF){
if(!n&&!m) break;
code[]=;
int cur=;
hm[cur].init();
hm[cur].push(,,);
for(i=;i<=n;i++)
for(j=;j<=m;j++){
hm[cur^].init();
dp(i,j,cur);
cur=cur^;
}
__int64 ans=;
for(i=;i<hm[cur].size;i++){
if(hm[cur].alst[i]==){
ans+=hm[cur].f[i];
}
}
printf("%I64d\n",ans);
}
return ;
}
POJ 2411 插头DP的更多相关文章
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- poj 2411 Mondriaan's Dream 【dp】
题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...
- Poj 2411 Mondriaan's Dream(压缩矩阵DP)
一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...
- POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)
题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这 ...
- POJ 1739 Tony's Tour (插头DP,轮廓线DP)
题意:给一个n*m的矩阵,其中#是障碍格子,其他则是必走的格子,问从左下角的格子走到右下角的格子有多少种方式. 思路: 注意有可能答案是0,就是障碍格子阻挡住了去路. 插头DP有两种比较常见的表示连通 ...
- POJ - 1185 炮兵阵地 (插头dp)
题目链接 明明是道状压dp的题我为啥非要用插头dp乱搞啊 逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况.S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y ...
随机推荐
- selenium3 + python - autoit上传文件
一.环境准备: 1.可以autoit官网上下载,安装 http://www.autoitscript.com/site/ 2.AutoIt里面几个菜单功能介绍: SciTE Script Editor ...
- Java数组去重(利用数组,不借助集合)
今天有个同学问我说老师,Java里边数组怎么去重,在不借助List集合的情况下,最后呢我整理了一下,打算发一篇博文,希望能帮助到有用的人,大佬绕过 public static void arrUniq ...
- Elasticsearch如何做到亿级数据查询毫秒级返回?
阅读本文大概需要 6 分钟. 如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有 ...
- 暴力(python)
输出由1,2,3,4组成的互不相同且无重复的三位数! #方式一 lst = ['1', '2', '3', '4'] res = [] for i in lst: for j in lst: for ...
- 点击文字弹出一个DIV层窗口代码 【或FORM表单 并且获取点击按钮的ID值】
点击不同按钮咨询不同的 专家 <?php for($i=1;$i<5;$i++){ $uid=$i; //用户ID ?> <a class="a_click" ...
- ios的认识
刚进了ios兴趣班,第一次使用苹果电脑,因为苹果电脑和windows电脑使用的区别很大.所以老师教我们苹果电脑的基本使用,以及关于苹果产品的一些认识.我听得热血沸腾,对苹果开发越来越感兴趣,相信下次上 ...
- CF615C Running Track
思路: kmp + 二分. 实现: #include <iostream> #include <cstdio> #include <algorithm> #incl ...
- C#语言最基础的数组和集合
数组的书写格式:数据类型[]变量名=new 数据类型[长度]: 集合的书写格式:List<变量类型>变量名=new List<变量类型>(): 集合添加元素:变量名.Add(数 ...
- iis设置404错误页,返回500状态码
一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...
- JS——事件冒泡与捕获
事件冒泡与事件捕获 1.冒泡:addEventListener("click",fn,false)或者addEventListener("click",fn): ...