题目链接:http://lightoj.com/volume_showproblem.php?

problem=1018

题意分析:平面上有不超过N个点,如今能够随意方向划直线将它们划去,问:最少要划几次能够把全部的点划去?

解题思路:我们能够使用集合S表示:有哪些点还没有被划掉,然后转移 dp[s] = min(dp[s &(~line[i][j])]) + 1;这里涉及到line[i][j]的处理,它代表的是在i点和j点构成的直线上一共同拥有几个点,须要预先处理。

边界条件就是S中集合元素 >0 && <= 2时,肯定是1。元素空时就是0了。

个人感受:一開始想到的是用s代表当前点没被划过的集合。然后卡在了怎么转移上,想着选两个点遍历着推断这两个点所在直线有几个点。感觉炒鸡麻烦。然后就是翻了别人的题解,看到了预处理这字样。豁然开朗啊~

详细代码例如以下:

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 20;
int x[MAXN], y[MAXN], line[MAXN][MAXN], n, dp[1 << 16]; void init()
{
memset(line, 0, sizeof line);
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
{
line[i][j] = (1 << i) | (1 << j);
int dx = x[j] - x[i], dy = y[j] - y[i];
for (int k = j + 1; k < n; ++k)
{
int dx2 = x[k] - x[i], dy2 = y[k] - y[i]; //这里我用了向量平行的条件
if (dx2 * dy == dy2 * dx)
line[i][j] |= (1 << k);
}
line[j][i] = line[i][j];
}
} int dfs(int s)
{
int& ret = dp[s];
if (dp[s] < INF) return ret;
int num = __builtin_popcount(s); //计算s中有几个1.非常好用的函数
if (num <= 2) return ret = 1;
int i = 0;
while (!(s & (1 << i))) ++i; //找出第一个没被删除的点
for (int j = i + 1; j < n; ++j) //和其他点进行匹配。 这里匹配次序是不会影响终于结果的
{
if (s & (1 << j))
{
ret = min(ret, dfs(s&(~line[i][j])) + 1);
}
}
return ret;
} int main()
{
int t;
for (int kase = scanf("%d", &t); kase <= t; ++kase)
{
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d%d", x+i, y+i);
init();
printf("Case %d: %d\n", kase, dfs((1 << n) - 1));
}
return 0;
}

[LightOJ 1018]Brush (IV)[状压DP]的更多相关文章

  1. Lightoj 1018 - Brush (IV)

    1018 - Brush (IV)    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...

  2. LightOJ1018 Brush (IV)(状压DP)

    题目大概说一个平面有n个灰尘,可以用一把刷子直直刷过去清理直线上的所有灰尘,问最少要刷几下才能清理完所有灰尘. 首先怎么刷其实是可以确定的,或者说直线有哪些是可以确定的,而最多就有C(n,2)条不一样 ...

  3. lightoj 1119 - Pimp My Ride(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1119 题解:状压dp存一下车有没有被搞过的状态就行. #include < ...

  4. lightoj 1037 - Agent 47(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1037 #include <iostream> #include & ...

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

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

  6. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  7. 【AGC012E】 Camel and Oases ST表+状压dp

    题目大意:一排点,两点间有距离. 初始你有一个行走值$v$,如果相邻两点距离不超过$v$你可以自由在这两点行走. 当$v$大于$0$时,你可以选择某一时刻突然飞到任意点,这样做后$v$会减半(下取整) ...

  8. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

    [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  9. K - Painful Bases 状压dp

    Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...

随机推荐

  1. ajax dataType

    dataType 类型:String 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 ...

  2. 10,*args **kwargs 函数的命名空间。

    用户传入到函数中的实参数量不定时,或者是为了以后拓展, 此时要用到动态参数*args,**kwargs(万能参数.) *args(接受的是所有的位置参数) 以元组的形式返回给函数调用者. **kwar ...

  3. HP DL380 G5 安装操作系统流程

    1.准备服务器引导盘,设置光盘启动.注意:会将服务器所有数据清除 2.依据引导盘选择需要的安装系统 3.插入系统安装光盘.ps:若kvm等远程工具无法插入光盘,需要插入物理介质的安装光盘

  4. iOS 开发之多线程之GCD

    1.GCD(Grand Centrol Dispath) 并行:宏观以及微观都是两个人再拿着两把铁锹在挖坑,一小时挖两个大坑 并发:宏观上是感觉他们都在挖坑,微观是他们是在使用一把铁锹挖坑,一小时后他 ...

  5. CentOS6配置静态IP

    CentOS6配置静态IP 1. 编辑网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=不需要改 TYPE=Et ...

  6. SQL server 数据库备份至服务器本地磁盘和其他服务器磁盘

    前言 因工作需要将数据库每日备份至服务器本地磁盘和其他服务器磁盘,对网上的例子进行改造,解决了SQL server数据库备份的问题. 一.将指定数据库备份到本地 将数据库affair_stydy全备份 ...

  7. 第四章 vim 可视模式

    第四章  vim 可视模式 vim的可视模式允许我们选中一块文本区域并进行操作 3种不同的可视模式  分为 操作字符文本      行文本 块文本 .命令用来重复执行可视模式中的命令   只有在操作面 ...

  8. jQuery插件封装系列(一)—— 金额录入框

    基于jQuery原型封装数值录入框,禁止录入.粘贴非数值字符 (function ($) { // 数值输入框 $.fn.numbox = function (options) { var type ...

  9. 关于maven下载慢的问题

    昨天刚接触到maven,尝试在mac上配置maven时发现,下载速度极度缓慢,从网上找了些方法,总算是解决了问题. 修改${maven.home}/conf或者${user.home}/.m2文件夹下 ...

  10. 测试开发系列之Python开发mock接口(三)

    于进入主题了,前面的准备工作都已经做好了,下面就开始写逻辑的代码了,代码我已经写好了,每行都加了注释,不明白的可以留言.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...