枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可

这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断转移合法只要预处理出所有三角形是否合法即可,同时预处理出三角形面积,转移就是f[j][k]=max(f[j][k],f[i][j]+c[s][j][k]);

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. const int N=105;
  7. int n,m;
  8. double c[N][N][N],f[N][N],g[N][N],ans;
  9. bool v[N][N][N];
  10. struct dian
  11. {
  12. double x,y;
  13. dian(double X=0,double Y=0)
  14. {
  15. x=X,y=Y;
  16. }
  17. dian operator + (const dian &a) const
  18. {
  19. return dian(x+a.x,y+a.y);
  20. }
  21. dian operator - (const dian &a) const
  22. {
  23. return dian(x-a.x,y-a.y);
  24. }
  25. }a[N],b[N];
  26. bool cmp(const dian &a,const dian &b)
  27. {
  28. return a.x<b.x||(a.x==b.x&&a.y<b.y);
  29. }
  30. int read()
  31. {
  32. int r=0,f=1;
  33. char p=getchar();
  34. while(p>'9'||p<'0')
  35. {
  36. if(p=='-')
  37. f=-1;
  38. p=getchar();
  39. }
  40. while(p>='0'&&p<='9')
  41. {
  42. r=r*10+p-48;
  43. p=getchar();
  44. }
  45. return r*f;
  46. }
  47. double cj(dian a,dian b)
  48. {
  49. return a.x*b.y-a.y*b.x;
  50. }
  51. bool ok(dian x,dian y,dian z)
  52. {
  53. for(int i=1; i<=m; i++)
  54. {
  55. if(cj(b[i]-x,y-x)>=0&&cj(b[i]-y,z-y)>=0&&cj(b[i]-z,x-z)>=0)
  56. return 0;
  57. if(cj(b[i]-x,y-x)<=0&&cj(b[i]-y,z-y)<=0&&cj(b[i]-z,x-z)<=0)
  58. return 0;
  59. }
  60. return 1;
  61. }
  62. double mj(dian a,dian b,dian c)
  63. {
  64. return abs(cj(b-a,c-a))/2;
  65. }
  66. int main()
  67. {
  68. n=read(),m=read();
  69. for(int i=1;i<=n;i++)
  70. a[i].x=read(),a[i].y=read();
  71. for(int i=1;i<=m;i++)
  72. b[i].x=read(),b[i].y=read();
  73. sort(a+1,a+1+n,cmp);
  74. for(int i=1;i<=n;i++)
  75. for(int j=1;j<=n;j++)
  76. for(int k=1;k<=n;k++)
  77. v[i][j][k]=ok(a[i],a[j],a[k]),c[i][j][k]=mj(a[i],a[j],a[k]);
  78. for(int s=1;s<=n;s++)
  79. {
  80. for(int i=1;i<=n;i++)
  81. for(int j=1;j<=n;j++)
  82. f[i][j]=g[i][j]=-1e9;
  83. for(int i=s+1;i<=n;i++)
  84. f[s][i]=g[s][i]=0;
  85. for(int i=s;i<=n;i++)
  86. for(int j=i+1;j<=n;j++)
  87. for(int k=j+1;k<=n;k++)
  88. if(v[s][j][k]&&cj(a[i]-a[j],a[k]-a[j])>=0)
  89. f[j][k]=max(f[j][k],f[i][j]+c[s][j][k]);
  90. for(int i=s;i<=n;i++)
  91. for(int j=i+1;j<=n;j++)
  92. for(int k=j+1;k<=n;k++)
  93. if(v[s][j][k]&&cj(a[i]-a[j],a[k]-a[j])<=0)
  94. g[j][k]=max(g[j][k],g[i][j]+c[s][j][k]);
  95. for(int t=s+1;t<=n;t++)
  96. for(int i=s;i<=t;i++)
  97. for(int j=s;j<=t;j++)
  98. ans=max(ans,f[i][t]+g[j][t]);
  99. }
  100. printf("%.2f\n",ans);
  101. return 0;
  102. }

bzoj 3778: 共鸣【计算几何+dp】的更多相关文章

  1. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)

    Clockwise Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya have a long necklace with ...

  2. [BZOJ 3791] 作业 【DP】

    题目链接:BZOJ - 3791 题目分析 一个性质:将一个序列染色 k 次,每次染连续的一段,最多将序列染成 2k-1 段不同的颜色. 那么就可以 DP 了,f[i][j][0|1] 表示到第 i ...

  3. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

    题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...

  4. BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)

    BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...

  5. BZOJ 4380 [POI2015]Myjnie | DP

    链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...

  6. BZOJ.5311.贞鱼(DP 决策单调)

    题目链接 很容易写出\(O(n^2k)\)的DP方程.然后显然决策点是单调的,于是维护决策点就可以了.. 这个过程看代码或者别的博客吧我不写了..(其实是忘了) 这样复杂度\(O(nk\log n)\ ...

  7. 【BZOJ 3090】 树形DP

    3090: Coci2009 [podjela] Description 有 N 个农民, 他们住在 N 个不同的村子里. 这 N 个村子形成一棵树.每个农民初始时获得 X 的钱.每一次操作, 一个农 ...

  8. POJ3178 计算几何+DP

    //一些点一些圆,过圆不能连线,相邻点不能连线,问最多连几条线 //计算几何模板+区间dp //关键是判断圆和线段是否相交 #include <cstdio> #include <c ...

  9. 『HGOI 20190917』Cruise 题解 (计算几何+DP)

    题目概述 在平面直角坐标系的第$1$象限和第$4$象限有$n$个点,其中第$i$个点的坐标为$(x_i,y_i)$,有一个权值$p_i$ 从原点$O(0,0)$出发,不重复的经过一些点,最终走到原点, ...

随机推荐

  1. 如何使Htm页面使用IE9文档模式

    修改Htm页面的方法之一是,在Head->Title下添加<META http-equiv="X-UA-Compatible" content="IE=9&q ...

  2. 图像滤镜艺术---PS图层混合模式之明度模式

    本文将介绍PS图层混合模式中比較复杂 的"明度"模式的算法原理及代码实现内容. 说到PS的图层混合模式,计算公式都有,详细代码实现也能找到,可是,都没有完整介绍全部图层混合模式的代 ...

  3. Redis(二)延迟队列

    1.目录 延迟队列 进一步优化 2.延迟队列 package com.redis; import java.lang.reflect.Type; import java.util.Set; impor ...

  4. listview 使用图片三级缓存图片闪动

  5. vue axios拦截器介绍

    关于axios的拦截器是一个作用非常大,非常好用的东西.分为请求拦截器和响应拦截器两种.我一般把拦截器写在main.js里. 1. 请求拦截器 请求拦截器的作用是在请求发送前进行一些操作,例如在每个请 ...

  6. Android 如何永久性开启adb 的root权限【转】

    本文转载自:https://www.2cto.com/kf/201702/593999.html adb 的root 权限是在system/core/adb/adb.c 中控制.主要根据ro.secu ...

  7. Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表

    题目链接:http://codeforces.com/contest/777/problem/C C. Alyona and Spreadsheet time limit per test 1 sec ...

  8. Nginx中的惊群现象解决方法

    *什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...

  9. Java NIO(一) 初步理解NIO

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式. 为什么要使用 NIO? NIO ...

  10. SDK Manager中勾选项

    运行SDK Manager 勾选对应版本的SDK,从这里基本可以知道一个Android版本对应着一个版本的API. 其中每个包都有这么几个文件: Documentation for Android S ...