一开始看范围特别小就写搜索了。。。结果自己随便出了个4*4就过不了了。。

  其实就是状态压缩DP,求哈密顿回路要多少条,只是要注意判断两点是否可以划线就可以了。

  

#include <stdio.h>
#include <string.h>
#include <algorithm>
typedef __int64 LL;
int n,m,tot;
int mz[25],bet[25][25][25],full;
int zero[16],zeros,hzero[25],lowb[65536];
LL d[16][65536],ans;
int cant(int st,int en,int stat){st=zero[st],en=zero[en];if(st>en)std::swap(st,en);for(int i=1;i<=bet[st][en][0];i++){int x=bet[st][en][i];if(mz[x]==1)return 1;if(mz[x]==0&&((stat>>hzero[x])&1)==0)return 1;}return 0;
}
LL dp(int last,int stat){if(d[last][stat]!=-1)return d[last][stat];if(stat==(stat&-stat))return 1;LL nans=0;int nstat=stat,now,i;while(nstat){now=(nstat&-nstat),i=lowb[now],nstat-=now;;if(i==last||cant(i,last,stat))continue;nans+=dp(i,stat&~(1<<last));}return d[last][stat]=nans;
}
int between(int k,int i,int j,int n,int m){int xk=k/m,yk=k%m,xi=i/m,yi=i%m,xj=j/m,yj=j%m;if((xk-xi)*(xk-xj)<=0&&(yk-yi)*(yk-yj)<=0){if((yj-yi)*(xk-xi)==(xj-xi)*(yk-yi))return 1;}return 0;
}
void init(int n,int m){for(int i=0;i<tot;i++){for(int j=i+1;j<tot;j++){int &x=bet[i][j][0];x=0;for(int k=i+1;k<j;k++){if(between(k,i,j,n,m))x++,bet[i][j][x]=k;}}}for(int i=0,x=1;i<16;i++,x<<=1)lowb[x]=i;
}
int main(){//  freopen("test.in","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){ans=0,tot=n*m,zeros=0;init(n,m);for(int i=0;i<tot;i++){scanf("%d",&mz[i]);if(mz[i]==0)hzero[i]=zeros,zero[zeros++]=i;}full=(1<<zeros)-1;for(int i=0;i<zeros;i++)for(int j=0;j<=full;j++)d[i][j]=-1;for(int i=0;i<zeros;i++)ans+=dp(i,full);printf("%I64d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/swm8023/archive/2012/08/27/2659375.html

HDU4026 Unlock the Cell Phone [状态压缩DP]相关推荐

  1. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  2. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  3. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  4. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  5. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  7. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  8. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  9. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

最新文章

  1. 笔记本电脑滑条无法连接synaptics定点装置驱动程序
  2. buuoj-crypto 1
  3. Struts2开发基本步骤
  4. Bootstrap全局CSS样式之表单
  5. urllib2的Post和Get请求
  6. Python 基础知识学习笔记——NumPy
  7. 佳能mf4400打印机无线服务器,佳能Canon imageCLASS MF4400 驱动
  8. Excel拆分单元格内容(把一个单元格的内容拆分到多列)
  9. python如何与access配合使用_使用Python对Access读写操作方法详解
  10. Qt源码分析--QPaintEngine
  11. 品牌该如何做好软文营销?软文营销怎么规避风险?
  12. ndo2db: Warning: Retrying message send. This can occur
  13. MySQL篇【5】——约束
  14. Android6.0下的短信接收与发送功能的实现
  15. SAP ABAP ZBA_R001 查询用户下的角色,事务代码
  16. 银行核心系统的清算与结算
  17. Allegro从ORCAD原理图生成网表后,导入Allegro PCB教程
  18. Android 手机上安装并运行 Ubuntu 12.04
  19. Freeswitch集成AMR编码
  20. 基于关联规则的推荐算法

热门文章

  1. CORS - 引入预检请求的动机是什么?
  2. Service服务Android
  3. html select 样式t调整_用纯css改变下拉列表select框的默认样式
  4. ajax send上传出错,AJAX + FormData 上传文件失败?
  5. linux keepalived 脚本,Linux下安装Keepalived及原理分析
  6. 洛谷——P1838 三子棋I
  7. 在JavaWeb中,什么是监听器?(建议收藏)
  8. 微信小程序API之video
  9. three.js获取模型大小
  10. linux之解决libipopt.so.1: Cannot open shared object file