愤怒的小鸟 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);

    最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. typedef double db;
  8. db ax[30],ay[30];
  9. int n,m;
  10. db ka,kb;
  11. int str[1000100],cnt,dp[300100];
  12. bool visit[1003000];
  13. void dispose(int x,int y)
  14. {
  15. db tmp1=ax[x]*ax[y]*(ax[x]-ax[y]);//------------------------
  16. db tmp2=ay[x]*ax[y]-ay[y]*ax[x];// |
  17. if(tmp1<0)// |
  18. {// |
  19. tmp1=-tmp1,tmp2=-tmp2;// |
  20. }// |
  21. if(fabs(tmp1)<1e-6)// |
  22. {// |
  23.      return;//我们在计算过这两个点和原点的抛物线解析式 |
  24. }// |
  25. tmp1=tmp2/tmp1;// |
  26. if(tmp1>0)// |
  27. {// |
  28. return;// |
  29. }// |
  30. ka=tmp1;// |
  31. kb=(ay[x]-ka*ax[x]*ax[x])/ax[x];//--------------------------
  32. int s=0;
  33. for(int i=1;i<=n;i++)//枚举所有的点,计算该点是否在当前枚举的抛物线之内
  34. {
  35. db tmp=ax[i]*ax[i]*ka+kb*ax[i];
  36. if(fabs(tmp-ay[i])<1e-6)
  37. {
  38. s+=(1<<(i-1));
  39. }
  40. }
  41. if(!visit[s])
  42. {
  43. visit[s]=1;
  44. str[++cnt]=s;//统计出一条抛物线能够杀死的pig的状态
  45. }
  46. return;
  47. }
  48. void original()
  49. {
  50. memset(visit,0,sizeof visit);
  51. memset(dp,0x3f,sizeof dp);
  52. cnt=0;
  53. }
  54. int main()
  55. {
  56. int cases;
  57. scanf("%d",&cases);
  58. while(cases--)
  59. {
  60. original();
  61. scanf("%d%d",&n,&m);
  62. for(int i=1;i<=n;i++)
  63. {
  64. scanf("%lf%lf",&ax[i],&ay[i]);
  65. }
  66. for(int i=1;i<=n;i++)
  67. {
  68. str[++cnt]=(1<<(i-1));
  69. for(int j=1;j<=i-1;j++)
  70. {
  71. dispose(i,j);
  72. }
  73. }
  74. dp[0]=0;
  75. for(int s=0;s<(1<<n);s++)
  76. {
  77. for(int i=1;i<=cnt;i++)
  78. {
  79. if(s&str[i])
  80. {
  81. dp[s]=min(dp[s],dp[s^(s&str[i])]+1);//转移方程
  82. }
  83. }
  84. }
  85. printf("%d\n",dp[(1<<n)-1]);
  86. }
  87. return 0;
  88. }

    小结:状态的选取决定着动态规划的走势----某乎上的dalao说的

[luogu2831][noip d2t3]愤怒的小鸟_状压dp的更多相关文章

  1. BZOJ_1076_[SCOI2008]奖励关_状压DP

    BZOJ_1076_[SCOI2008]奖励关_状压DP 题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛 ...

  2. BZOJ_2064_分裂_状压DP

    BZOJ_2064_分裂_状压DP Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的 ...

  3. 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 ...

  4. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP

    BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...

  5. 2018.10.17 NOIP模拟 管道(状压dp)

    传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...

  6. 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)

    上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...

  7. Noip2016愤怒的小鸟(状压DP)

    题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...

  8. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  9. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

随机推荐

  1. 如何获取Linux-gate.so.1动态库

    前面"Linux应用程序Helloworld入门"已经提到在Linux下每个可执行文件都依赖于几个最为基本的动态库,其中一个就是linux-gate.so.1. 从上面ldd给出的 ...

  2. CSS注释

    CSS注释 1./*注释内容*/ /*-moz-background-origin:border; -webkit-background-origin:border; -moz-background- ...

  3. WebService之CXF注解之一(封装类)

    Teacher.java: /** * @Title:Teacher.java * @Package:com.you.model * @Description:老师封装类 * @author:Youh ...

  4. VxWorks 符号表

    符号表初始化           符号表用于建立符号名称.类型和值之间的关系.其中,名称为null结尾的任意字符串:类型为标识各种符号的整数:值为一个字符指针.符号表主要用来作为目标模块加载的基础,但 ...

  5. 芝麻HTTP:TXT文本存储

    将数据保存到TXT文本的操作非常简单,而且TXT文本几乎兼容任何平台,但是这有个缺点,那就是不利于检索.所以如果对检索和数据结构要求不高,追求方便第一的话,可以采用TXT文本存储.本节中,我们就来看下 ...

  6. 8.C++-类的关键字

    在之前学习的C++章节里,可以发现结构体越来越不像C语言里的结构体了 比如,里面可以定义函数,可以定义private/public,结构体名还可以指向父类. 但是C++需要兼容C,所以C++中便提供了 ...

  7. SpringMVC_第一个程序

    一.基本代码的完成 补充 1.在myeclipse中 WEB-INF下放的资源和WebRoot下的资源区别: WEB-INF下放到资源是不能通过浏览器直接访问的,是比较安全的,只能是后台服务端程序进行 ...

  8. 「拆小鹤」使用 python 实现 QQ机器人服务。

    使用的是python的qqbot机器人库,我其实只是实现了这个库的一个插件. 具体的说明,我觉得qqbot的官方文档,还有我的插件的注释都写得很详细了,可以直接看.所以有空再写吧. 没错我就是懒..

  9. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  10. 在windows10上配置Android的环境变量

    一, 首先右击"我的计算机"或"此电脑"图标,在弹出来的下拉列表中点击"属性(R)",进入到"系统"属性面板,点击左侧的 ...