【noip2016d2t3】状压DP+巧妙优化
题意可以简单这样考虑
给出n^2个集合(每个集合的元素不超过n),包含某个元素的集合至少有n个,选出最少的集合,使这些集合的并包含n个元素
n最大只有18
可以考虑状压n个元素,然后枚举n^2个集合
这样的复杂度是2^n*n^2
但是我们可以这样考虑,因为最终的集合一定包含所有的元素,所以不妨预处理出每个状态中最靠左的0的位置,
然后每次只需要考虑包含这个元素的n个集合(因为你最终一定要包含这个元素,所以不如就先包含它)
这样复杂度就降低成2^n*n
注意精度,以及两个点不一定能构成抛物线
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std; struct Pair
{
double x, y;
Pair() {}
Pair(double _x, double _y):x(_x), y(_y) {}
}p[];
int Map[][];
vector<int> State;
int f[(<<())], Hash[(<<())];
Pair Get(Pair A, Pair B)
{
if(A.x == B.x && A.y == B.y) B.x = A.x+;
double y = (B.y*A.x - B.x*A.y)/(B.x*B.x*A.x - A.x*A.x*B.x);
double x = (A.y - y*A.x*A.x)/A.x;
return Pair(x, y);
}
const double eps = 1e-;
bool On(Pair A, Pair X)
{
return abs(X.y - A.x*X.x - A.y*X.x*X.x) < eps;
}
int n, m, T;
int And(int X, int i)
{
for(int j = ; j <= n; j++)
if(Map[i][j]) X = X|(<<(j-));
return X;
}
void debug(int X)
{
for(int i = ; i < n; i++) if(X&(<<i)) cout<<; else cout<<;
cout<<endl;
}
int main()
{
for(int i = ; i <= (<<)-; i++)
{
for(int j = ; j <= ; j++)
if((i&(<<j)) == ) { Hash[i] = j+; break; }
}
cin>>T;
while(T--)
{
cin>>n>>m;
memset(Map, , sizeof(Map));
memset(f, , sizeof(f));
State.clear(); State.push_back();
for(int i = ; i <= n; i++) cin>>p[i].x>>p[i].y;
int tot = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
Pair temp = Get(p[i], p[j]);
if(temp.y >= ) continue;
for(int k = ; k <= n; k++)
if(On(temp, p[k]))
Map[(i-)*n+j][k] = ;
}
int k = , M = (<<n)-;
while(f[M] == )
{
int sz = State.size();
for(int s = k; s < sz; s++)
{
for(int i = ; i <= n; i++)
{
int s2 = And(State[s], (Hash[State[s]]-)*n+i);
if(f[s2] == && s2 != )
{
f[s2] = f[State[s]] + ;
State.push_back(s2);
}else
f[s2] = min(f[s2], f[State[s]] + );
}
}
k = sz;
}
cout<<f[(<<n)-]<<endl;
}
}
【noip2016d2t3】状压DP+巧妙优化的更多相关文章
- 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...
- NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]
我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS ...
- Codeforces 917C - Pollywog(状压 dp+矩阵优化)
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...
- BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】
题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...
- POJ1038 Bugs Integrated, Inc 状压DP+优化
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...
- bzoj2004 矩阵快速幂优化状压dp
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...
- T2988 删除数字【状压Dp+前缀和优化】
Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
随机推荐
- 解决nsis error!cant initialize plug-ins directory.please try again later
情况1: 调用SectionEnd会释放掉dll初始化标记,所有Section都必须放在函数的最下面. 情况2: 有可能是栈里的数据错乱,特别注意的是,使用BgWorker.dll获取多线程能力的时候 ...
- C#如何使用异步编程【BeginInvoke/EndInvoke】
怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种 ...
- 洛谷题解:P1209 【[USACO1.3]修理牛棚 Barn Repair】
原题传送门:https://www.luogu.org/problemnew/show/P1209 首先,这是一道贪心题. 我们先来分析它的贪心策略. 例如,样例: 4 50 18 3 4 6 ...
- Zeppelin interperter 模式设置总结图解1
如有错漏,望请指正,不胜感激. 参考:[zeppelin官网]:https://zeppelin.apache.org/docs/latest/interpreter/spark.html#inter ...
- SSH 登录时出现如下错误:No supported key exchange algorithms
https://help.aliyun.com/knowledge_detail/41486.html
- 【c学习-2】
#include <stdio.h> #define MYVAR 18 int main(){ //float x=3.14; //x=3.14++; //printf("%c\ ...
- 初试PHP连接sql server
最开始想使用 pdo_sqlsrv 拓展,但是一直没成功,本文采用的是 pdo_dblib + freetds. 环境:CentOS 6.8.PHP 5.6.20 freetds wget ftp:/ ...
- laravels -- Swoole加速php
LaravelS是一个胶水项目,用于快速集成Swoole到Laravel,然后赋予它们更好的性能.更多可能性. 环境 : ubuntu16 + nginx + php7.1 + LaravelS搭建高 ...
- 数据分析处理库Pandas——merge操作
有一列列名相同值也相同 有两列列名相同值也相同 按其中一列合并 按两列合并 有一列列名相同值也相同,有一列列名相同值不相同,按两列合并 列名相同值不相同的行删掉 保留所有行 保留所有行并显示合并后该值 ...
- Pandas 索引和切片
Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习 列索引:df['列名'] (Series不存在列索引) 行索引:df.loc[].df.iloc[] 选择列 / ...