比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数.

然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举.

code:

  1. #include <bits/stdc++.h>
  2. #define N 21
  3. #define LL long long
  4. #define setIO(s) freopen(s".in","r",stdin)
  5. using namespace std;
  6. const LL mod=100000007;
  7. const double eps=1e-4,inf=100000000.0;
  8. int tmp[N],v[N][N],vis[N],Log[1<<N];
  9. LL f[1<<N][N];
  10. int lowbit(int t)
  11. {
  12. return t&(-t);
  13. }
  14. struct data
  15. {
  16. double x,y;
  17. data(double x=0,double y=0):x(x),y(y){}
  18. }a[N];
  19. double slope(int x,int y)
  20. {
  21. if(abs(a[x].x-a[y].x)<=eps) return inf;
  22. else return (a[x].y-a[y].y)/(a[x].x-a[y].x);
  23. }
  24. int main()
  25. {
  26. // setIO("input");
  27. int i,j,n,k;
  28. scanf("%d",&n);
  29. Log[1]=0;
  30. for(i=2;i<(1<<N);++i) Log[i]=Log[i>>1]+1;
  31. for(i=0;i<=n;++i) tmp[i]=1<<i;
  32. for(i=0;i<n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);
  33. for(i=0;i<n;++i) f[tmp[i]][i]=1ll;
  34. for(i=0;i<n;++i)
  35. {
  36. for(j=0;j<n;++j)
  37. {
  38. for(k=0;k<n;++k)
  39. {
  40. if(k!=i&&k!=j)
  41. {
  42. double slope1=slope(k,i),slope2=slope(k,j);
  43. if(abs(slope1-slope2)<=eps&&a[k].x>=min(a[i].x,a[j].x)&&a[k].x<=max(a[i].x,a[j].x)&&a[k].y>=min(a[i].y,a[j].y)&&a[k].y<=max(a[i].y,a[j].y))
  44. {
  45. v[i][j]|=tmp[k];
  46. }
  47. }
  48. }
  49. }
  50. }
  51. int S;
  52. LL ans=0ll;
  53. for(S=0;S<(1<<n);++S)
  54. {
  55. for(k=0;k<n;++k)
  56. {
  57. int ss=S;
  58. while(ss)
  59. {
  60. j=Log[lowbit(ss)];
  61. if(!(S&(tmp[k]))&&(v[j][k]&S)==v[j][k]) (f[S|tmp[k]][k]+=f[S][j])%=mod;
  62. ss-=lowbit(ss);
  63. }
  64. }
  65. }
  66. for(S=0;S<(1<<n);++S)
  67. {
  68. int sz=0;
  69. for(j=0;j<n;++j) if(S&tmp[j]) ++sz;
  70. if(sz>=4)
  71. {
  72. for(j=0;j<n;++j) if(S&tmp[j]) (ans+=f[S][j])%=mod;
  73. }
  74. }
  75. printf("%lld\n",ans);
  76. return 0;
  77. }

  

bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制的更多相关文章

  1. BZOJ5299:[CQOI2018]解锁屏幕(状压DP)

    Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由3x3个点组成,手指在屏幕上画一条 线将其中一些点连接起来,即可构成一个解锁图案.如下面三个例 ...

  2. BZOJ 5299: [Cqoi2018]解锁屏幕

    状压DP #include<cstdio> using namespace std; const int mod=1e8+7; int F[1000005][25],dis[25][25] ...

  3. BZOJ.4145.[AMPPZ2014]The Prices(状压DP)

    BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...

  4. BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

  5. BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作

    #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...

  6. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

  7. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...

  8. BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解

    挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...

  9. BZOJ 3864 Hero meet devil (状压DP)

    最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...

随机推荐

  1. 【C#】上机实验七

    .开发一个窗体应用程序,窗体上能接收华氏温度或者摄氏温度,点击相应按钮可以相互转换. 要求转换后的华氏温度或者摄氏温度保留小数点后3位,程序中要有异常处理结构. using System; using ...

  2. ADO.Net和SqlHelper封装

    1.什么是ADO.Net 简单来讲,ADO.NET是用于和数据源打交道的.Net结束,是一组向.NET程序员公开数据访问服务的类   2.ADO.NET的组成部分和对象模型 (1)ADO.NET的两个 ...

  3. C# vb .net实现羽化效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的羽化效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  4. Wenaox 一款轻量性能好的微信小程序状态管理库

    感慨一下!!! 从开始开发 wenaox 从开始到现在,,时不时更新一下,改一改 bug,却发现已经快 1 年了 orz 虽然很少人用 hhh,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...

  5. 在js中把json中的 key去掉双引号的方法

    方法一: //数据格式是这样的: var data = '[{"id":30348079,"name":"表1","score&q ...

  6. fastjson源码分析之序列化

    fastJson是很常用的序列化工具,用了这么久一直想底层看一下它的设计,探究一下它序列化和反序列化效率高的秘密.现在从最基础的用法开始,一点点揭开fastJson神秘的面纱.(版本:1.2.50) ...

  7. iview carousel 图片不显示;iview 轮播图 图片无法显示(转载)

    转载来源:https://segmentfault.com/q/1010000016778108 相关代码 <Carousel autoplay v-model="value2&quo ...

  8. Python学习日记(十九) 模块导入

    模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在comm ...

  9. Python——迭代器&可迭代对象

    可迭代对象 什么是对象: Python中,一切皆对象.一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象.一个对象就是一个实例,就是实实在在的东西. 什么是迭代 迭代就是一个重复的过程 ...

  10. HashMap,HashSet

    HashMap,HashSet 摘自:https://www.cnblogs.com/skywang12345/p/3310887.html#a1 目录 一.    HashMap(键值对形式存取,键 ...