题目链接

bzoj 5299: [Cqoi2018]解锁屏幕

题解

很水的装压dp,相信没人需要看题解....

dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了

不过 我读入优化没读负数 ,为什么mod1e8 +7,我 mod 1e9 + 7 啊,WA了两发

#include<cstdio>
#include<vector>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-')f = -1; c = getchar();}
while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar();
return x * f;
}
#define mod 100000007
int n;
const int maxn = 21;
struct node {
int x,y;
bool operator < (const node &a)const {
if(x == a.x) return y < a.y;
return x < a.x;
}
} loc[maxn];
int dp[(1 << maxn) + 7][maxn];
int po[maxn][maxn];
void get(node x,node y,int X,int Y) {
int a = y.y - x.y , b = x.x - y.x , c = y.x * x.y - x.x * y.y;
int tmp = 0;
for(int i = X + 1;i < Y;++ i) {
if(loc[i].x * a + loc[i].y * b + c == 0)
tmp |= (1 << i);
//if(i != Y)vec[X].push_back(i); if(i != X)vec[Y].pish_back(i);
}
po[X][Y] = tmp | (1 << X); // ^ (1 << Y);
po[Y][X] = tmp | (1 << Y); // ^ (1 << X);
//printf("%d\n",tmp);
}
int main() {
n = read();
for(int i = 0;i < n;++ i)
loc[i].x = read(),loc[i].y = read();
std::sort(loc,loc + n);
for(int i = 0;i < n;++ i)
for(int j = i + 1;j < n;++ j)
get(loc[i],loc[j],i,j);
int ans = 0;
for(int i = 0;i < n;++ i) dp[1 << i][i] = 1;
for(int i = 0;i < (1 << n);++ i) {
//ans = 0;
for(int j = 0;j < n;++ j) {
if(((1 << j) & i)) continue;
for(int k = 0;k < n;++ k) {
if(!((1 << k) & i)) continue;
if((po[k][j] & i) == po[k][j]){dp[i | (1 << j)][j] = (dp[i | (1 << j)][j] + dp[i][k]) % mod;}
}
}
}
for(int K,i = 0;i < (1 << n);++ i) {
K = 0;
for(int t = i;t;t >>= 1) if(t & 1)K ++;
if(K >= 4) {
for(int k = 0;k < n;++ k)
ans = (ans + dp[i][k]) % mod;
}
}
printf("%d\n",ans);
return 0;
}

bzoj5299: [Cqoi2018]解锁屏幕的更多相关文章

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

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

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

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

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

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

  4. P4460 [CQOI2018]解锁屏幕

    算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...

  5. [CQOI2018]解锁屏幕

    嘟嘟嘟 这题感觉真的很简单-- \(O(n ^ 2 logn)\)的做法特别好理解,但得开O2. 看数据范围,肯定是状压dp.但刚开始我没想通状压啥,因为点与点之间还有顺序问题.但后来发现这个顺序是子 ...

  6. 【[CQOI2018]解锁屏幕】

    状压这个东西好像没有什么能优化的高级东西,像什么斜率优化,单调队列在状压的优化上都很少见 而最常见的状压优化就是预处理优化了, 这道题就预处理一下所有点对之间连线上的点,之后压成状态就能做到\(O(2 ...

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

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

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

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

  9. 【BZOJ5299】【CQOI2018】解锁屏幕(动态规划,状态压缩)

    [BZOJ5299][CQOI2018]解锁屏幕(动态规划,状态压缩) 题面 BZOJ 洛谷 Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由 ...

随机推荐

  1. 赶快收藏!16款最流行的 JavaScript 框架

    下面为大家介绍 16款最流行的 JavaScript 框架,赶快收藏! 1. jQuery – Javascript框架 jQuery 是最流行的 JavaScript 框架,它简化了HTML 文档遍 ...

  2. iframe子夜页面调父页面的方法 取父页面的值

    1.调父页面的方法的写法 window.parent.yincang();//yincang()是父页面的一个方法 2.取父页面的值的写法 window.parent.document.gettEle ...

  3. UIDynamicBehavior的行为类翻译

    CHENYILONG Blog UIDynamicBehavior的行为类翻译 © chenyilong. Powered by Postach.io Blog

  4. 设置display:inline-block产生间隙

    display:inline-block产生间隙,是由于换行在内的空白符 display:inline-block在IE下仅仅是触发了layout,而它本是行布局,触发后,块元素依然还是行布局.所以需 ...

  5. npm install ERR! code E400/E404

    在安装webpack的过程中,出现了一个报错npm install ERR! code E400/E404 解决方法: 1.查看npm配置文件 是否有错误: 执行 npm config edit 查看 ...

  6. java处理金证中登查询图片二进制流问题

    package com.szkingdom.kess.model; import java.io.File; import java.io.FileOutputStream; import java. ...

  7. 【BubbleCup X】F:Product transformation

    按照题解的规律,首先能看出前面每个数幂次的性质. 然后发掘约数的性质 #include<bits/stdc++.h> ; typedef long long ll; using names ...

  8. #题目:有10 台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次

    #题目:有10 台被监控主机.一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次 #测试机器:虚拟机Linux ...

  9. 查看wtmp(登陆信息的内容)

      /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debi ...

  10. Python 中for...esle和while...else语法

    Python的for...else和while...else语法,这是Python中最不常用,最为误解的语法特性之一. Python中的for.while循环都有一个可选的else分支(类似if语句和 ...