zoukankan      html  css  js  c++  java
  • 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>
    #include<cmath>
    using namespace std;
    const int N=105;
    int n,m;
    double c[N][N][N],f[N][N],g[N][N],ans;
    bool v[N][N][N];
    struct dian
    {
    	double x,y;
    	dian(double X=0,double Y=0)
    	{
    		x=X,y=Y;
    	}
    	dian operator + (const dian &a) const
    	{
    		return dian(x+a.x,y+a.y);
    	}
    	dian operator - (const dian &a) const
    	{
    		return dian(x-a.x,y-a.y);
    	}
    }a[N],b[N];
    bool cmp(const dian &a,const dian &b)
    {
    	return a.x<b.x||(a.x==b.x&&a.y<b.y);
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    double cj(dian a,dian b)
    {
    	return a.x*b.y-a.y*b.x;
    }
    bool ok(dian x,dian y,dian z)
    {
    	for(int i=1; i<=m; i++)
    	{
    		if(cj(b[i]-x,y-x)>=0&&cj(b[i]-y,z-y)>=0&&cj(b[i]-z,x-z)>=0)
    			return 0;
    		if(cj(b[i]-x,y-x)<=0&&cj(b[i]-y,z-y)<=0&&cj(b[i]-z,x-z)<=0)
    			return 0;
    	}
    	return 1;
    }
    double mj(dian a,dian b,dian c)
    {
    	return abs(cj(b-a,c-a))/2;
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=n;i++)
    		a[i].x=read(),a[i].y=read();
    	for(int i=1;i<=m;i++)
    		b[i].x=read(),b[i].y=read();
    	sort(a+1,a+1+n,cmp);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			for(int k=1;k<=n;k++)
    				v[i][j][k]=ok(a[i],a[j],a[k]),c[i][j][k]=mj(a[i],a[j],a[k]);
    	for(int s=1;s<=n;s++)
    	{
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				f[i][j]=g[i][j]=-1e9;
    		for(int i=s+1;i<=n;i++)
    			f[s][i]=g[s][i]=0;
    		for(int i=s;i<=n;i++)
    			for(int j=i+1;j<=n;j++)
    				for(int k=j+1;k<=n;k++)
    					if(v[s][j][k]&&cj(a[i]-a[j],a[k]-a[j])>=0)
    						f[j][k]=max(f[j][k],f[i][j]+c[s][j][k]);
    		for(int i=s;i<=n;i++)
    			for(int j=i+1;j<=n;j++)
    				for(int k=j+1;k<=n;k++)
    					if(v[s][j][k]&&cj(a[i]-a[j],a[k]-a[j])<=0)
    						g[j][k]=max(g[j][k],g[i][j]+c[s][j][k]);
    		for(int t=s+1;t<=n;t++)
    			for(int i=s;i<=t;i++)
    				for(int j=s;j<=t;j++)
    					ans=max(ans,f[i][t]+g[j][t]);
    	}
    	printf("%.2f
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/lokiii/p/10805649.html
Copyright © 2011-2022 走看看