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

题意分析:二分平面上有N个点,现在有一把可沿着任何方向走的刷子可以刷去这些点,问最少需要刷出多少条直线可以把点刷完?

解题思路:这个是个比较典型的状压dp问题,首先N不大,可以用二进制表示每个点的状态,1表示还没有被刷掉,0表示被刷掉了。

那么状态from中有num个1,如果num<=2显然是为1的,0的话就是0。那么我们想法刷掉from中的点,这样就可以得到状态to,比如我们刷掉的是i,j两个点,显然,这两个点中间的点也会被刷掉,用line[i][j]表示这两点之间点的状态,然后对应着把from中对应line[i][j]的点变成0,这样就得到状态to了,dp[from]=min(dp[from],dp[from|line[i][j]]+1)。

当然也可以写成记忆画搜索的。。。

感悟:由于开始没有想到line这个东西,直接枚举三点一线的情况来进行状态转移,TLE到爆,本地跑随机的120组数据就要花10s以上的时间,更不要说题目给的3000这么大的数了。

/*****************************************
Author      :Crazy_AC(JamesQi)
Time        :2015
File Name   :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <climits>
using namespace std;
#define MEM(x,y) memset(x, y,sizeof x)
#define pk push_back
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 17;
int line[maxn][maxn];
int dp[1<<maxn];
int t,icase=0;
int n;
int x[maxn],y[maxn];
bool check(int i,int j,int k){ii A(x[i]-x[j],y[i]-y[j]);ii B(x[i]-x[k],y[i]-y[k]);return A.first*B.second-A.second*B.first==0;
}
inline void Initation(){for (int i=0;i<n;++i){for(int j=i+1;j<n;++j){for (int k=0;k<n;++k){if (check(i,j,k))line[i][j] |= 1<<k;}line[j][i]=line[i][j];}}
}
// int dfs(int cur){
//     if (dp[cur] < INF) return dp[cur];
//     int num = __builtin_popcount(cur);
//     if (num <= 2) return 1;
//     int i=0;
//     while(!(cur&(1<<i)))i++;
//     for(int j=i+1;j<n;++j){
//         if (cur&(1<<j)){
//             dp[cur]=min(dp[cur],dfs(cur &(~line[i][j]))+1);
//         }
//     }
//     return dp[cur];
// }
vector<int> G[1 << maxn];
int main()
{    // freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);for (int i=0;i<70000;++i){for(int j=0;j<maxn;++j){if ((i&(1<<j))==0)G[i].push_back(j);}}scanf("%d",&t);while(t--){scanf("%d",&n);memset(line, 0,sizeof line);memset(dp,INF,sizeof dp);dp[0]=0;for (int i=0;i<n;++i){scanf("%d%d",&x[i],&y[i]);line[i][i] = (1<<i);}Initation();cout << "Case " << ++icase << ": ";int up=1<<n;for (int i=0;i<up;++i){int xx=G[i][0];for (int j=0;j<G[i].size();++j){int yy=G[i][j];dp[i|line[xx][yy]]=min(dp[i|line[xx][yy]],dp[i]+1);}}cout << dp[up-1] <<endl;// cout << dfs((1<<n)-1) << endl;}return 0;
}

lightoj 1018 - Brush (IV)相关推荐

  1. lightoj刷题日记

    开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: ----------------- 必须要update了... so...板刷第二页搞呀--2017/4/17 ...

  2. dp百题大过关(第一场)

    好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem    这 ...

  3. 评分卡模型剖析之一(woe、IV、ROC、信息熵)

    信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广 ...

  4. lightoj 1098 A New Function 约数之和(一道奇怪的数论) 整除分块优化

    文章目录 题目如下: 思考人生: 题目如下: lightoj 1098 A New Function 求1-n所有数的所有约数之和(不包括1和它本身).n<=2e9. 思考人生: 首先考虑打表找 ...

  5. woe分析_评分卡模型剖析之一(woe、IV、ROC、信息熵)

    评分卡模型剖析之一(woe.IV.ROC.信息熵) 信用评分卡模型在国外是一种成熟的预测方法,尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用,其原理是将模型变量WOE编码方式离散化之后 ...

  6. Pairs Forming LCM LightOJ - 1236

    Pairs Forming LCM LightOJ - 1236 题意 问共有多少组数的最大公约数是n 分析 组合数学 ,唯一分解定理 参考代码 int Prime[670000]; const in ...

  7. LightOJ 1364 Expected Cards(概率+DP)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1364 题意:一副牌.依次在桌面上放牌.求放了四种花色的牌为C,D,H,S张时放的牌数的 ...

  8. (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...

    Altera Stratix IV系列FPGA Row bank的TRUE LVDS_RX支持oct(on chip termination),所以设计的时候不需要外接一个100ohm电阻.备注:我使 ...

  9. lightoj 1014

    lightoj 1014 Ifter Party 链接:http://www.lightoj.com/volume_showproblem.php?problem=1014 题意:给你两个数 p, l ...

最新文章

  1. 【java】实现一个简单的正则:判断一个字符串是否全由数字组成
  2. LCD 常用的客观效果指标和测试方法
  3. 【学习笔记】OI模板整理
  4. LeetCode 750. 角矩形的数量(DP)
  5. “大团队”和“敏捷开发”,谁说不可兼得?
  6. Idea插件——Translation 翻译插件安装与使用
  7. oracle查询最近十条数据_Oracle-查询最近更新的前10条数据
  8. 蓝牙 配对 android,Android蓝牙工具类:连接、配对、传输
  9. 微信公众平台H5支付
  10. 自动升级Notes客户机AUT功能实战
  11. python中使用splash如何挂代理?
  12. 第一次毕业设计任务书
  13. can总线隔离中继器、canbridge-100、CanRepeater的can波特率和滤波设置
  14. OpenGL 镜面反射光
  15. Icon图标制作(转化)工具
  16. 高斯白噪声的统计特性
  17. dedecms织梦搬家数据库导入失败
  18. 视频编解码和MPEG4编码
  19. 基于java的微信支付之JSAPI公众号充值
  20. vector sort排序 —— cmp 写法

热门文章

  1. 基于Django手机销售网站
  2. 【有灵魂的网页 CodePen】:大量前端源码,比如圣诞树、节日祝福、浪漫表白等
  3. JSP程序设计实训(十二)——MVC设计模式
  4. laytpl v1.1 独立版本 js模板渲染引擎
  5. 搭建新浪RPC框架motan Demo
  6. Python打包(可执行文件)
  7. 用C编写COM(一)
  8. c语言iconv转码错误,iconv编码转换的问题
  9. 想要实现带货直播源码秒开?先看看这个
  10. loading动画css3动画