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 ...
随机推荐
- JS IIFE写法
IIFE 博客分类: 前端开发 介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>) ...
- Timewarp 一种生成当中帧技术,异步时间扭曲(Asynchronous Timewarp)
翻译: https://www.oculus.com/blog/asynchronous-timewarp/ 异步时间扭曲(Asynchronous Timewarp 时间扭曲,即调整时长) 关 ...
- 35W行数据的文本文件,每500行添加4个换行符。代码实现思路
- UITableView的子控件高度不确定处理
比如,tableView的tableFootView的控件数量是根据网络请求的数据而定的.那么tableView并不能准确的设置其contentSize.处理方法: 在tableFootView的类中 ...
- UVALive 2323 Modular Multiplication of Polynomials(模拟)
这是一个相对简单的模拟,因为运算规则已经告诉了我们,并且比较简单,不要被吓到…… 思路:多项式除以另外一个多项式,如果能除,那么他的最高次一定被降低了,如果最高次不能被降低,那说明已经无法被除,就是题 ...
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- 学习笔记——工厂模式Factory
Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象. 当需要大量获得对象时,每一次都new会很麻烦. <真菌世界>游戏中,一个星球上有很多树,一棵树会不断生成 ...
- mysql HA-keepalived
关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对 ...
- windbg 之 如何设置模块加载时断下
这里先介绍两个指令: sx指令: The sx* commands control the action that the debugger takes when an exception occur ...
- ListView显示多种类型的item
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class Mai ...