ZOJ 3537 Cake
区间DP。
首先求凸包判断是否为凸多边形。
如果是凸多边形:假设现在要切割连续的一段点,最外面两个一定是要切一刀的,内部怎么切达到最优解就是求子区间最优解,因此可以区间DP。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std; const int MAXN = ;
const int INF = 0x7FFFFFFF;
struct point
{
int x, y;
};
point List[MAXN];
point a[MAXN];
int dp[MAXN][MAXN];
int Stack[MAXN], top;
int n, p;
int tot; int cross(point p0, point p1, point p2)
{
return (p1.x - p0.x)*(p2.y - p0.y) - (p1.y - p0.y)*(p2.x - p0.x);
}
double dis(point p1, point p2)
{
return sqrt((double)(p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y));
}
bool cmp(point p1, point p2)
{
int tmp = cross(List[], p1, p2);
if (tmp>) return true;
else if (tmp == && dis(List[], p1)<dis(List[], p2)) return true;
else return false;
}
void init()
{
int i, k;
point p0;
scanf("%d%d", &List[].x, &List[].y);
p0.x = List[].x;
p0.y = List[].y;
k = ;
for (i = ; i<n; i++)
{
scanf("%d%d", &List[i].x, &List[i].y);
if ((p0.y>List[i].y) || ((p0.y == List[i].y) && (p0.x>List[i].x)))
{
p0.x = List[i].x;
p0.y = List[i].y;
k = i;
}
}
List[k] = List[];
List[] = p0; sort(List + , List + n, cmp);
} void graham()
{
int i;
if (n == ) { top = ; Stack[] = ; }
if (n == )
{
top = ;
Stack[] = ;
Stack[] = ;
}
if (n>)
{
for (i = ; i <= ; i++) Stack[i] = i;
top = ; for (i = ; i<n; i++)
{
while (top> && cross(List[Stack[top - ]], List[Stack[top]], List[i]) <= ) top--;
top++;
Stack[top] = i;
}
}
} int cost(int i, int j)
{
return (abs(a[i].x + a[j].x)*abs(a[i].y + a[j].y)) % p;
} void work()
{
int tmp = top + ; tot = ;
if (tmp != n) printf("I can't cut.\n");
else
{
while (top != -) a[tot++] = List[Stack[top--]];
for (int r = , i = tot; r<tot - ; r++, i++) a[i] = a[i - tot]; tot = * tot - ; for (int i = ; i < tot; i++)
for (int j = ; j < tot; j++)
dp[i][j] = INF; for (int i = ; i < tot; i++)
{
int st = i, en = st + - ;
dp[st][en] = ;
} for (int i = ; i<tmp; i++)
{
for (int j = ; j<tot; j++)
{
int st = j, en = st + i - ;
if (en >= tot) continue;
for (int k = st + ; k <= en - ; k++)
dp[st][en] = min(dp[st][en], dp[st][k] + dp[k][en] + cost(st, en));
}
} int ans = INF;
for (int i = ; i<tot; i++)
{
int st = i, en = st + tmp - - ;
if (en>=tot) continue;
ans = min(ans, dp[st][en]);
}
printf("%d\n", ans);
}
} int main()
{
while (~scanf("%d%d", &n, &p))
{
init();
graham();
work();
}
return ;
}
ZOJ 3537 Cake的更多相关文章
- zoj 3537 Cake 区间DP (好题)
题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...
- zoj 3537 Cake (凸包确定+间隔dp)
Cake Time Limit: 1 Second Memory Limit: 32768 KB You want to hold a party. Here's a polygon-sha ...
- ZOJ 3537 Cake(凸包+区间DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...
- 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 ...
- 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 ...
- zoj 3537 Cake(区间dp)
这道题目是经典的凸包的最优三角剖分,不过这个题目给的可能不是凸包,所以要提前判定一下是否为凸包,如果是凸包的话才能继续剖分,dp[i][j]表示已经排好序的凸包上的点i->j上被分割成一个个小三 ...
- 区间DP Zoj 3537 Cake 区间DP 最优三角形剖分
下面是别人的解题报告的链接,讲解很详细,要注意细节的处理...以及为什么可以这样做 http://blog.csdn.net/woshi250hua/article/details/7824433 我 ...
- ZOJ 3537 Cake 求凸包 区间DP
题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...
- ZOJ 3537 Cake (区间DP,三角形剖分)
题意: 给出平面直角坐标系上的n个点的坐标,表示一个多边形蛋糕,先判断是否是凸多边形,若否,输出"I can't cut.".若是,则对这个蛋糕进行3角形剖分,切n-3次变成n-2 ...
随机推荐
- linux命令:find详解
Linux中find命令常见用法示例: find path -option [-print] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出#-e ...
- WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...
- HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)
需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...
- Python作用域
以下依据Python 3 1.Python变量查找顺序为LEGB(L:Local,E:Enclosing,G:Global,B:Built-in). 2.实际上,在Python中,只有模块,类以及函数 ...
- php Memcached
PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务,接下来我们为大家介绍 PHP 如何使用 Memcached 服务. PHP Memcache 扩展 ...
- MVVM 入门介绍
转载自:http://www.objccn.io/issue-13-1/ 我于 2011 年在 500px 找到自己的第一份 iOS 开发工作.虽然我已经在大学里做了好几年 iOS 外包开发,但这才是 ...
- 删除 win8.1中的网络1,网络2,宽带连接1,宽带连接2等网络记录
新建txt文本,保存如下内容为reg文档: Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W ...
- SimplePath 使用心得
上图是 用SimplePath 做的 寻路,其中 三个 绿点 是 移动的 目标点,三个红点 是 角色移动,蓝色方块是阻挡物体. 这三个角色 移动 有三种 方式,1 随机移动2 按照 绿色小球点 移动 ...
- jz2440 环境搭建遇到的问题
已解决:
- 滑轮关节(b2PulleyJoint)
package{ import Box2D.Collision.b2AABB; import Box2D.Collision.b2RayCastInput; import Box2D.Collisio ...