题目大意:给你一个n (n<=300) 边形,给出它所有的顶点坐标,让你把它划分成n-2个三角形的花费最小值,顶点 a 和 b 相连的花费为

abs(a.x+b.x)*abs(a.y+b.y)。 如果是凹多边形输出无解。

思路:先跑个凸包判断是不是凸多边形,跑完之后点的顺序是逆时针的,我们考虑区间dp,dp[ i ][ j ]表示,从顶点 i 沿多边形的边逆时针跑到

顶点 j 所形成的折线和 直线i->j,所围成的多边形分割成小三角形所需要的花费。

状态转移方程: dp[ i ][ j ]=min(dp[ i ][ j ] , dp[ i ][ k ]+dp[ k ][ j ]+cost[ i ][ k ]+cost[ k ][ j ]); 如果j-i<=2 显然花费为0,所以答案微dp[ 0 ][ n-1]。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
int n,tot,dp[N][N],cost[N][N],mod;
struct point
{
int x,y;
point(int _x=,int _y=){x=_x; y=_y;}
point operator -(const point &rhs)const
{
return point(x-rhs.x,y-rhs.y);
}
}p[N],cp[N];
typedef point vec;
int cross(const vec &a,const vec &b)
{
return (a.x*b.y)-(a.y*b.x);
}
int dis(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool cmp(const point &a,const point &b)
{
int z=cross(a-p[],b-p[]);
if(z>||(z== && dis(p[],a)<dis(p[],b)))
return ;
else return ;
}
void get_cp()
{
int k=; tot=;
for(int i=;i<n;i++)
if(p[i].y<p[k].y || p[i].y==p[k].y && p[i].x<p[k].x) k=i;
swap(p[],p[k]);
sort(p+,p+n,cmp);
tot=,cp[]=p[];cp[]=p[];
for(int i=;i<n;i++)
{
while(tot> && cross(cp[tot-]-cp[tot-],p[i]-cp[tot-])>) tot--;
cp[tot++]=p[i];
}
}
void init()
{
memset(dp,-,sizeof(dp));
memset(cost,,sizeof(cost));
}
int solve(int l,int r)
{
if(dp[l][r]!=-) return dp[l][r];
if(r-l<=) return ;
dp[l][r]=inf;
for(int k=l+;k<=r-;k++)
dp[l][r]=min(solve(l,k)+solve(k,r)+cost[l][k]+cost[k][r],dp[l][r]);
return dp[l][r];
}
int main()
{
while(scanf("%d%d",&n,&mod)!=EOF)
{
for(int i=;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y);
get_cp();
if(tot<n)
{
puts("I can't cut.");
continue;
}
init();
for(int i=;i<n;i++)
for(int j=i+;j<n;j++)
cost[i][j]=cost[j][i]=abs(cp[i].x+cp[j].x)*abs(cp[i].y+cp[j].y)%mod; printf("%d\n",solve(,n-));
} return ;
}

ZOJ-3537的更多相关文章

  1. zoj 3537 Cake 区间DP (好题)

    题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...

  2. ZOJ 3537 Cake(凸包+区间DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...

  3. zoj 3537 Cake(区间dp)

    这道题目是经典的凸包的最优三角剖分,不过这个题目给的可能不是凸包,所以要提前判定一下是否为凸包,如果是凸包的话才能继续剖分,dp[i][j]表示已经排好序的凸包上的点i->j上被分割成一个个小三 ...

  4. zoj 3537 Cake (凸包确定+间隔dp)

    Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-sha ...

  5. ZOJ 3537 Cake

    区间DP. 首先求凸包判断是否为凸多边形. 如果是凸多边形:假设现在要切割连续的一段点,最外面两个一定是要切一刀的,内部怎么切达到最优解就是求子区间最优解,因此可以区间DP. #include< ...

  6. 区间DP Zoj 3537 Cake 区间DP 最优三角形剖分

    下面是别人的解题报告的链接,讲解很详细,要注意细节的处理...以及为什么可以这样做 http://blog.csdn.net/woshi250hua/article/details/7824433 我 ...

  7. zoj 3537 区间dp+计算几何

    题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...

  8. ZOJ 3537 Cake(凸包判定+区间DP)

    Cake Time Limit: 1 Second Memory Limit: 32768 KB You want to hold a party. Here's a polygon-shaped c ...

  9. ZOJ 3537 Cake 求凸包 区间DP

    题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...

  10. ZOJ - 3537 Cake (凸包+区间DP+最优三角剖分)

    Description You want to hold a party. Here's a polygon-shaped cake on the table. You'd like to cut t ...

随机推荐

  1. A+ B

    题目描述 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B ...

  2. java实现网页验证码

    Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletExceptio ...

  3. string字符串js操作

    String 对象方法 方法 描述 anchor() 创建 HTML 锚. big() 用大号字体显示字符串. blink() 显示闪动字符串. bold() 使用粗体显示字符串. charAt() ...

  4. UE4的AI学习(2)——官方案例实例分析

    官方给出的AI实例是实现一个跟随着玩家跑的AI,当玩家没有在AI视野里时,它会继续跑到最后看到玩家的地点,等待几秒后如果仍然看不到玩家,则跑回初始地点.官方的案例已经讲得比较详细,对于一些具体的函数调 ...

  5. POJ 2513 Colored Sticks (欧拉回路+并查集+字典树)

    题目链接 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with ...

  6. mac系统在配置navicat时连接数据的时候提示can't connect to mysql server on '127.0.0.1'

          新建数据库连接的时候,将默认的端口号更改掉,改为3307,即可解决这个问题. 具体是为什么我也不清楚,我自己想的一个可能就是mac电脑 上的某个程序可能已经占用了3306那个默认的端口,因 ...

  7. 关于python中的类方法(classmethod)和静态方法(staticmethod)

    首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...

  8. WIN10 ISO 官方

    WIN10   ISO  官方: https://www.microsoft.com/zh-cn/software-download/windows10ISO/

  9. mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid)

    mysql启动报错Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.p ...

  10. 如何设置使eclipse修改代码不重启tomcat

    tomcat配置 1.server.xml reloadable="true"<Context docBase="ins" path="/ins ...