POJ3178 计算几何+DP

 1 //一些点一些圆,过圆不能连线,相邻点不能连线,问最多连几条线
 2 //计算几何模板+区间dp
 3 //关键是判断圆和线段是否相交
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <algorithm>
 7 #define N 500
 8 #define ll long long
 9 #define sqr(x) ((x)*(x))
10 using namespace std;
11 bool ok[N][N];
12 ll n,m,r,f[N][N];
13 struct poi
14 {
15     ll x,y;
16     poi(ll X,ll Y)
17     {
18         x=X;y=Y;
19     }
20     poi()
21     {
22     }
23 } p[N],q[N];
24 ll cro(poi a,poi b)
25 {
26     return (a.x*b.y-a.y*b.x);
27 }
28 ll dot(poi a,poi b)
29 {
30     return a.x*b.x+a.y*b.y;
31 }
32 poi tr(poi a,poi b)
33 {
34     return poi(a.x-b.x,a.y-b.y);
35 }
36 double dis(poi a,poi b)
37 {
38     return sqrt((double)(sqr(a.x-b.x)+sqr(a.y-b.y)));
39 }
40 bool cmp(poi a,poi b)
41 {
42     return (a.x<b.x)||(a.x==b.x && a.y<b.y);
43 }
44 bool cmp2(poi a,poi b)
45 {
46     return cro(tr(a,p[1]),tr(b,p[1]))>0;
47 }
48 bool check(poi a,poi b)
49 {
50     double C=dis(a,b);
51     for(int i=1;i<=m;i++)
52     {
53         double A=dis(q[i],a);
54         double B=dis(q[i],b);
55         double COSA=(B*B+C*C-A*A)/(2*B*C);
56         double COSB=(A*A+C*C-B*B)/(2*A*C);
57         if(COSA<1e-10||COSB<1e-10){
58             if(A<1.0*r+1e-10||B<1.0*r+1e-10)return 0;
59             else continue;
60         }
61         double SINA=sqrt(1-COSA*COSA);
62         double H=B*SINA;
63         if(H<1.0*r+1e-10)return 0;
64     }
65     return 1;
66 }
67 int main()
68 {
69     scanf("%d%d%d",&n,&m,&r);
70     for(int i=1;i<=n;i++)
71         scanf("%d%d",&p[i].x,&p[i].y);
72     sort(p+1,p+1+n,cmp);
73     sort(p+2,p+1+n,cmp2);
74     for(int i=1;i<=m;i++)
75         scanf("%d%d",&q[i].x,&q[i].y);
76     for(int i=1;i<=n;i++)
77         for(int j=i+2;j<=n;j++)
78         if(i!=1 || j!=n)
79             ok[i][j]=check(p[i],p[j]);
80     for(int len=2;len<=n;len++)
81         for(int start=1;start<=n;start++){
82             ll end=start+len;
83             for(int k=start+1;k<min(end,n);k++)
84                 f[start][end]=max(f[start][end],f[start][k]+f[k][end]);
85             f[start][end]+=ok[start][end];
86         }
87     printf("%d\n",f[1][n]);
88 }
时间: 2025-01-06 14:52:10

POJ3178 计算几何+DP的相关文章

poj3178 Roping the Field (计算几何 + dp)

Roping the Field Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 858   Accepted: 250 Description Farmer John is quite the nature artist: he often constructs large works of art on his farm. Today, FJ wants to construct a giant "field web&

Code Chef MINPOLY(计算几何+dp)

题面 传送门 题解 我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序 我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\)内部的点的\(b\)总和(不包括边界),然后记\(dp_{i,j,k}\)表示这个凸多边形之前两个点是\(p_i,p_j\),还需要\(k\)个点,最小的\(b\)是多少,然后可以直接记忆化搜索 //minamoto #include<bits/stdc++.h> #define R regis

bzoj 3778: 共鸣【计算几何+dp】

枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可 这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断转移合法只要预处理出所有三角形是否合法即可,同时预处理出三角形面积,转移就是f[j][k]=max(f[j][k],f[i][j]+c[s][j][k]); #include<iostream> #include<cstdio> #include<algorithm> #i

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o

HDU6219/POJ1259 [ICPC2017沈阳]Empty Convex Polygons 最大空凸包

Empty Convex Polygons Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 538    Accepted Submission(s): 138 Problem Description Given a set of distinct points S on a plane, we define a convex ho

O(n^3)求最大空凸包模板(2017沈阳icpc-C Empty Convex Polygons )

题目链接:https://vjudge.net/contest/358714#problem/C 题意:求最大空凸包的面积,点的个数n<=50. 思路: 参考链接:https://blog.csdn.net/cdsszjj/article/details/79366813 计算几何+DP. 首先枚举凸包最左下角的点O,忽略O下面的点,对其它点进行极角排序. 然后枚举凸包上的最后一个点i,用dp[i][j]表示以三角形Oij为凸包的最后一块三角形的最大空凸包的面积.那么可以得到转移方程: dp[i

[hdu contest 2019-07-29] Azshara&#39;s deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点. 首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里. 然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp. 区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连

2016 CCPC 网络赛 B 高斯消元 C 树形dp(待补) G 状压dp+容斥(待补) H 计算几何

2016 CCPC 网络赛 A - A water problem 水题,但读题有个坑,输入数字长度很大.. B - Zhu and 772002 题意:给出n个数(给出的每个数的质因子最大不超过2000),选出多个数相乘得b.问有多少种选法让b 为完全平方数. tags:高斯消元,求异或方程组解的个数.   好题 每个数先素数分解开.  对于2000以内的每个素数p[i],这n个数有奇数个p[i]则系数为1,偶数个则系数为0,最后n个数的p[i]系数异或和都要为0才会使得最后的积为完全平方数.

zoj 3735 dp+计算几何

题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的费用,问最少的切割费用. 链接:点我 题解:点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath>