[luogu2831][noip d2t3]愤怒的小鸟_状压dp
愤怒的小鸟 noip-d2t3 luogu-2831
题目大意:给你n个点,问最少需要多少条经过原点的抛物线将其覆盖。
注释:1<=点数<=18,1<=数据组数<=30。且规定抛物线是开口向下的。
想法:其实一开始的想法是很偏的,就是设dp[i][j][k]表示在状态k下建立$i_{th}$和$j_{th}$的抛物线的最少条数,然后向后转移。这显然是错误的,错误原因在于... 我日,没个转移。然后看了一下lijinnn的题解...啊?切了。
是这样的,我们通过记录每条抛物线所能覆盖的点,将其记录在数组str中,不分先后顺序。然后,我们考虑状态
dp[s]表示达到s状态的最少条数。
转移:
dp[s]=min(dp[ s ] , dp[ s ^ ( s & str[ i ] ) ] + 1);
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef double db;
db ax[30],ay[30];
int n,m;
db ka,kb;
int str[1000100],cnt,dp[300100];
bool visit[1003000];
void dispose(int x,int y)
{
db tmp1=ax[x]*ax[y]*(ax[x]-ax[y]);//------------------------
db tmp2=ay[x]*ax[y]-ay[y]*ax[x];// |
if(tmp1<0)// |
{// |
tmp1=-tmp1,tmp2=-tmp2;// |
}// |
if(fabs(tmp1)<1e-6)// |
{// |
return;//我们在计算过这两个点和原点的抛物线解析式 |
}// |
tmp1=tmp2/tmp1;// |
if(tmp1>0)// |
{// |
return;// |
}// |
ka=tmp1;// |
kb=(ay[x]-ka*ax[x]*ax[x])/ax[x];//--------------------------
int s=0;
for(int i=1;i<=n;i++)//枚举所有的点,计算该点是否在当前枚举的抛物线之内
{
db tmp=ax[i]*ax[i]*ka+kb*ax[i];
if(fabs(tmp-ay[i])<1e-6)
{
s+=(1<<(i-1));
}
}
if(!visit[s])
{
visit[s]=1;
str[++cnt]=s;//统计出一条抛物线能够杀死的pig的状态
}
return;
}
void original()
{
memset(visit,0,sizeof visit);
memset(dp,0x3f,sizeof dp);
cnt=0;
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
original();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&ax[i],&ay[i]);
}
for(int i=1;i<=n;i++)
{
str[++cnt]=(1<<(i-1));
for(int j=1;j<=i-1;j++)
{
dispose(i,j);
}
}
dp[0]=0;
for(int s=0;s<(1<<n);s++)
{
for(int i=1;i<=cnt;i++)
{
if(s&str[i])
{
dp[s]=min(dp[s],dp[s^(s&str[i])]+1);//转移方程
}
}
}
printf("%d\n",dp[(1<<n)-1]);
}
return 0;
}
小结:状态的选取决定着动态规划的走势----某乎上的dalao说的
[luogu2831][noip d2t3]愤怒的小鸟_状压dp的更多相关文章
- BZOJ_1076_[SCOI2008]奖励关_状压DP
BZOJ_1076_[SCOI2008]奖励关_状压DP 题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛 ...
- BZOJ_2064_分裂_状压DP
BZOJ_2064_分裂_状压DP Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的 ...
- BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...
- BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...
- Noip2016愤怒的小鸟(状压DP)
题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
随机推荐
- R语言︱数据规范化、归一化
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:规范化主要是因为数据受着单位的影响较 ...
- linux内核升级(ubuntu12.04从3.13.0升级到3.4.0 )
花了一天的时间,终于把ubuntu12.04 的linux内核版本从3.13.0升级到3.4.0 升级后,系统更加稳定.具体步骤:# wget http://www.kernel.org/pub/li ...
- 芝麻HTTP:python version 2. required,which was not found in the registry 解决方案
不能在注册表中识别python2.7 新建一个register.py 文件 import sys from _winreg import * # tweak as necessary version ...
- BZOJ 5039: [Jsoi2014]序列维护
5039: [Jsoi2014]序列维护 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 282 Solved: 169[Submit][Status ...
- 【CJOJ1372】【洛谷2730】【USACO 3.2.5】魔板
题面 Description 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...
- IDEA2017版本打可运行jar包并运行
一.打JAR包 JAR:From modules with dependencies 将依赖一起打包 一般依赖放在与xx.jar同级的libs文件夹中 敲黑板,下图第一个框是输出jar包的位置,第二 ...
- 一年iOS工作经验,如何一举拿下百度、美团、快手等Offer面经(附面试题)
前言: 先简单说说我最近的面试经历吧.面试的公司很多,大部分最后都能得到令人满意的结果,我将这些体会记录下来,面了这么多公司,如果不留下什么,那岂不是太浪费了.对于我来说,这也是一次自我检查,在这次面 ...
- 文件导出也可以这么写【js+blob】
文件导出在软件开发中是个比较常用的功能,基本原理也很简单: 浏览器向后台发送一个Get请求 后台处理程序接收到请求后,经过处理,返回二进制文件流 浏览器接收到二进制文件流后提示下载文件 调用的js方法 ...
- Topshelf 一个简化Windows服务开发的宿主服务框架
Topshelf是 基于.net框架开发的宿主服务框架.该框架简化了服务的创建,开发人员只需要使用 Topshelf编写一个控制台程序,就能安装为Windows服务.之所以这样原因非常简单:调试一个控 ...
- C++学习-5
1.static_cast静态转换<>要转换的类型,不适用于指针转换 reinterpret_cast<char*>()指针类型的转换 涉及到const,必须用const_ca ...