problem

luogu-P4460

solution

题面以及数据告诉我们显然是状压 dpdpdp。

设 f(s,i):f(s,i):f(s,i): 经过的点集 sss 最后一次画的点为 iii 的方案数。

直接枚举下一个之前没被画的点 jjj 转移即可。

f(s∣2j,j)←f(s,i)f(s|2^j,j)\leftarrow f(s,i)f(s∣2j,j)←f(s,i)。

但这里需要保证 i,ji,ji,j 两点间若存在点,必须这些点之前都被画过了。

我们预处理,开个 bitset\text{bitset}bitset ,g(i,j):g(i,j):g(i,j): 与 i,ji,ji,j 贡献且在 i,ji,ji,j 线段上的点集。

共线判断我们常用的是斜率,即 yk−yixk−xi=yk−yjxk−xj\frac{y_k-y_i}{x_k-x_i}=\frac{y_k-y_j}{x_k-x_j}xk​−xi​yk​−yi​​=xk​−xj​yk​−yj​​。

但计算机 /0/0/0 是会 RE\text{RE}RE 的,所以我们尽量避免处罚,交叉相乘判断相等即可。

共线只是一个条件,必须是在 i,ji,ji,j 形成的线段上,所以和 i,ji,ji,j 的横纵坐标判断一下即可。

最后的最后,就是这道题可以不用完所有点

条件只说了画的点数不小于 444 即可。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 100000007
#define maxn 20
bitset < maxn > g[maxn][maxn];
int n, ans;
int X[maxn], Y[maxn], f[1 << maxn][maxn];bool check( int l, int r, int i ) {if( (X[i] - X[l]) * (Y[i] - Y[r]) != (X[i] - X[r]) * (Y[i] - Y[l]) )return 0;if( (X[i] >= max(X[l], X[r]) or X[i] <= min(X[l], X[r])) and (Y[i] >= max(Y[l], Y[r]) or Y[i] <= min(Y[l], Y[r])) ) return 0;return 1;
}signed main() {scanf( "%lld", &n );for( int i = 0;i < n;i ++ ) scanf( "%lld %lld", &X[i], &Y[i] );if( n < 4 ) return ! puts("0");for( int i = 0;i < n;i ++ )for( int j = 0;j < n;j ++ )for( int k = 0;k < n;k ++ )if( i == j or i == k or j == k ) continue;else if( check( i, j, k ) ) g[i][j][k] = 1;for( int i = 0;i < n;i ++ ) f[1 << i][i] = 1;for( int s = 0;s < (1 << n);s ++ ) {for( int i = 0;i < n;i ++ )if( f[s][i] )for( int j = 0;j < n;j ++ )if( s >> j & 1 ) continue;else {for( int k = g[i][j]._Find_first();k != g[i][j].size();k = g[i][j]._Find_next( k ) )if( ! (s >> k & 1) ) goto pass;(f[s | (1 << j)][j] += f[s][i]) %= mod;pass:;}}int ans = 0;for( int s = 0;s < (1 << n);s ++ )if( __builtin_popcount( s ) >= 4 )for( int i = 0;i < n;i ++ )(ans += f[s][i]) %= mod;printf( "%lld\n", ans );return 0;
}

[CQOI2018] 解锁屏幕(状压dp)相关推荐

  1. [学习笔记]状压dp

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

  2. 题解 P4460 【[CQOI2018]解锁屏幕】

    题目链接:Link Problem 题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构 ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

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

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

  7. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  10. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

最新文章

  1. android服务之录音功能
  2. 【TensorFlow-windows】keras接口——BatchNorm和ResNet
  3. *** Python版一键安装脚本
  4. CSS之Screen视图属性
  5. Swift 优雅的打印Log
  6. c#异常类的闰年判断
  7. ai模仿声音软件_你准备好跟AI机器成为同事了吗?
  8. 高并发架构系列:分布式锁的由来、特点及Redis分布式锁的实现详解
  9. 几个快速提升工作效率的小工具(Listary等)分享一下(强烈建议收藏)
  10. CentOS下转换网易云音乐ncm格式为mp3
  11. Locahost和本地IP地址有什么区别?
  12. JavaFX scene切换
  13. Android开发——kotlin语法基础
  14. 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
  15. 手机里的照片导入计算机的方法,如何把iphone照片导入电脑 四种方法分享【图文】...
  16. 【考研】考研经验及教训分享(强烈推荐计算机专业且专业课有计算机组成原理或数据结构的看进来)
  17. 支持历史阅读记录的PDF阅读工具
  18. html5支付成功页面,订单完成页面视图《 微信支付:H5 移动端支付 》
  19. 十六计使SEO优化道路了如指掌
  20. 怎么把电脑上大于4G的文件移动到U盘?

热门文章

  1. 有趣程序和让人捧腹大笑的注释,你的注释还不够骚
  2. 入门机器学习,开启人工智能大门!
  3. 干货|MIT线性代数课程精细笔记[第二课]
  4. 全国二级计算机理论知识,2021年度全国计算机等级考试二级MSOffice常考知识点基础知识部分.doc...
  5. linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...
  6. python 百度百科 爬虫_python简单爬虫
  7. oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了
  8. mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)
  9. 超详细图解!【MySQL进阶篇】MySQL索引原理
  10. 火柴人_火柴人 x THANKSGIVING