Description

使用过Android手机的同学一定对手势解锁屏幕不陌生。Android的解锁屏幕由3x3个点组成,手指在屏幕上画一条
线将其中一些点连接起来,即可构成一个解锁图案。如下面三个例子所示:
画线时还需要遵循一些规则
1.连接的点数不能少于4个。也就是说只连接两个点或者三个点会提示错误。
2.两个点之间的连线不能弯曲。
3.每个点只能"使用"一次,不可重复。这里的"使用"是指手指划过一个点,该点变绿。
4.两个点之间的连线不能"跨过"另一个点,除非那个点之前已经被"使用"过了。
对于最后一条规则,参见下图的解释。左边两幅图违反了该规则:而右边两幅图(分别为2→4→1→3→6和→5→4→1→9→2)
则没有违反规则,因为在"跨过"点时,点已经被"使用"过了。
现在工程师希望改进解锁屏幕,增减点的数目,并移动点的位置,不再是一个九宫格形状,但保持上述画线的规则不变。
请计算新的解锁屏幕上,一共有多少满足规则的画线方案。

Input

输入文件第一行,为一个整数n,表示点的数目。
接下来n行,每行两个空格分开的整数xi和yi,表示每个点的坐标。
-1000≤xi,Yi≤l000,1≤n<20。各点坐标不相同

Output

输出文件共一行,为题目所求方案数除以100000007的余数。

Sample Input

4
0 0
1 1
2 2
3 3

Sample Output

8
解释:设4个点编号为1到4,方案有1→2→3→4,2→1→3→4,3→2→1→4,2→3→1→4,
及其镜像4→3→2→1,3→4→2→1,2→3→4→1,3→2→4→1.

Solution

一道挺简单的状压DP……
不知道CQ省选为什么会出状压板子题
先预处理出连接两点会经过哪些点
然后f[i][S]表示以i结尾,当前已经选中的点状态为S
从小到大枚举S进行转移
理论复杂度n^2*2^n,然而肯定跑不满就是了。
还有把1e-16写成-1e16这么丢人的事我才不会说╭(╯^╰)╮  

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N (600000)
using namespace std;
int n,x[N],y[N],f[][N],line[][],ans,num[N]; double K(double x1,double y1,double x2,double y2)
{
if (x1==x2) return ;
if (y1==y2) return ;
return (y2-y1)/(x2-x1);
} int main()
{
scanf("%d",&n);
for (int i=; i<=n; ++i)
scanf("%d%d",&x[i],&y[i]); for (int i=; i<=n-; ++i)
for (int j=i+; j<=n; ++j)
{
line[i][j]=line[j][i]=(<<i-)|(<<j-);
for (int k=; k<=n; ++k)
{
if (abs(K(x[k],y[k],x[i],y[i])-K(x[j],y[j],x[i],y[i]))>1e-) continue;
if (!( x[k]>=min(x[i],x[j]) && x[k]<=max(x[i],x[j]) )) continue;
if (!( y[k]>=min(y[i],y[j]) && y[k]<=max(y[i],y[j]) )) continue;
line[i][j]|=(<<k-), line[j][i]=line[i][j];
}
} for (int i=; i<=n; ++i)
f[i][<<i-]=;
for (int i=; i<=(<<n)-; ++i)
for (int j=; j<=n; ++j)
if (i&(<<j-))
for (int k=; k<=n; ++k)
if (!(i&(<<k-)) && (((i|line[j][k])^(<<k-)))==i)
(f[k][i|(<<k-)]+=f[j][i])%=; for (int i=; i<=(<<n)-; ++i)
{
int x=i,cnt=;
for (int j=; j<=n; ++j){if (x&) cnt++; x>>=;}
if (cnt<) continue;
for (int j=; j<=n; ++j)
(ans+=f[j][i])%=;
}
printf("%d",ans);
}

BZOJ5299:[CQOI2018]解锁屏幕(状压DP)的更多相关文章

  1. bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制

    比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...

  2. bzoj5299: [Cqoi2018]解锁屏幕

    题目链接 bzoj 5299: [Cqoi2018]解锁屏幕 题解 很水的装压dp,相信没人需要看题解.... dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了 不过 我读入优化没读 ...

  3. BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】

    题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...

  4. [学习笔记]状压dp

    状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...

  5. [Luogu] P4460 [CQOI2018]解锁屏幕

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

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  8. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

随机推荐

  1. [转]【Oracle Database 12c新特性】32k varchar2 max_string_size

    本文转自:https://blogs.oracle.com/askmaclean/entry/oracle_database_12c%E6%96%B0%E7%89%B9%E6%80%A7_32k_va ...

  2. 基于语法分析器GOLD Parser开发的数学表达式计算器

    最近发现一款文法分析神器,看完官网(http://goldparser.org/)的介绍后感觉很犀利的样子,于是就拿来测试了一番,写了一个数学表达式分析的小程序,支持的数学运算符如下所示:常规运算:+ ...

  3. Cheatsheet: 2017 02.01 ~ 02.28

    Web Debouncing and Throttling Explained Through Examples What is TypeScript? An Absolute Beginner's ...

  4. JFrame自适应大小

    pack();函数调用PreferedSize(); 所以对于组件要setPreferedSize();

  5. Coherence 简介

    Coherence是Oracle为了建立一种高可靠和高扩展集群计算的一个关键部件.   典型的使用Coherence的架构图是: Coherence被放在应用服务器和数据库服务器之间,从而解决通常应用 ...

  6. 结构型--代理模式(Proxy)

    一.代理模式是什么? 代理模式属于GOF23设计模式中结构型中的设计模式,通过代理对象来屏蔽(部分或者屏蔽)对真实对象的直接访问,下图为UML图: 在代理模式中组件包括:抽象角色接口.代理角色类.真实 ...

  7. maven仓库中的LastUpdated文件删除脚本

    cleanLastUpdated.bat(windows版本) @echo off rem create by NettQun rem 这里写你的仓库路径 set REPOSITORY_PATH=D: ...

  8. python中循环删除list和dict类型注意事项

    列表和字典在循环操作(增删)时,其长度会改变 # 删除 li = [11, 22, 33, 44, 'rock']中索引为单数的元素 # 方法一 del li[1::2] print(li) # [1 ...

  9. sql left join 字符串

    select * FROM table1 as t1 right join (select '1,2,3,4,5'  as t) as tt on t1.Id=tt.t select * FROM t ...

  10. 2013年未之wpf项目乱述

    不知识为何现已很少在网上发帖,貌似人生的方向已经看的七七八八.要么用心工作,要么自主创业.无论怎么样,对于现在的我来说都是一种淡定的选择.作为一个c#程序员,今年下半年开始使用wpf,更觉得wpf将来 ...