zoukankan      html  css  js  c++  java
  • 【题解】【CQOI2018】解锁屏幕(玄学优化)

    题目背景

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

    题目描述

    画线时还需要遵循一些规则:
    连接的点数不能少于4 个。也就是说只连接两个点或者三个点会提示错误。
    两个点之间的连线不能弯曲。
    每个点只能“使用”一次,不可重复。这里的“使用”是指手指划过一个点,该点变绿。
    两个点之间的连线不能“跨过”另一个点,除非那个点之前已经被“使用”过了。
    现在工程师希望改进解锁屏幕,增减点的数目,并移动点的位置,不再是一个九宫格形状,但保持上述画线的规则不变。请计算新的解锁屏幕上,一共有多少满足规则的画线方案。

    输入格式

    输入文件第一行,为一个整数n,表示点的数目。
    接下来n 行,每行两个空格分开的整数(x_i)(y_i),表示每个点的坐标。

    输出格式

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

    说明/提示

    对于30%的数据,1≤n≤10
    对于100%的数据,-1000≤(x_i),(y_i)≤1000,1≤n<20。各点坐标不相同


    题解

    首先前排安利PhDdalao的博客QwQ
    看完他的你就会发现我把他的题解Ctrl C, Ctrl V到了自己的博客上
    状态:f[i][j]表示当前使用集合为i,且最后一个点是j的总方案数.
    这道题是从前向后推:
    对于每个状态 f[i][j] ,可以枚举它下一次连接的点 k ,新的集合为i|(1<<(k-1)),从当前集合转移到新的集合的条件是: j 和 k 连线上的所有点都已经在 s 这个状态中已经被使用(这个可以提前预处理用一个二维数组数组存j到k连线上的点的集合)。
    状态转移方程为f[i|(1<<(k-1))][k]+=f[i][j];
    最后统计答案的时候需要排除连接的点小于4个的状态.

    代码不见了,被我搞丢了(冷漠.jpeg)

    记得玄学优化(除了快读快输,(O_2),(O_3)以外,主要是加法取膜可以修改为如下形式){
    if(a+b>mod)ans=a+b-mod;
    }

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/qwqq/p/11436223.html
Copyright © 2011-2022 走看看