zoj 3537 凸包+三角剖分dp(切蛋糕)

这是一道关于计算几何的问题,题目要求在给定的多边形蛋糕顶点间进行切分,寻找最小代价的三角剖分方案。首先,通过判断多边形是否为凸包来简化问题。如果是凸多边形,可以通过动态规划或记忆化搜索求解最优三角剖分。对于凹多边形,需要在枚举过程中检查切线是否合法,确保不穿过多边形外部。最终目标是找到使得代价cost(i, j) = |xi + xj| * |yi + yj| % p最小的三角剖分策略。" 113543798,10543030,MySQL 8 停止从服务器复制操作指南,"['MySQL复制', '数据库管理', 'SQL命令']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出一些点表示多边形蛋糕的顶点的位置(如果蛋糕是凹多边形就不能切),切蛋糕时每次只能在顶点和顶点间切,每一次切蛋糕都有相应的代价,给出代价的公式为:cost(i, j) = |xi + xj| * |yi + yj| % p(其中p为输入里给定的一个常数)。问把蛋糕三角剖分的最小代价是多少?

思路:

首先判断多边形是凸的非常容易,只要求一遍凸包看看凸包的点数和给定的点数是不是一样多即可(可以有优化:如果有点弹出栈,那么必然不是凸多边形)

三角剖分问题是典型的dp问题。用dp[i][j]表示从i点到j点所构成的多边形的最优三角剖分,我们以(i,j)边为三角形的一边,那么三角形的另一个顶点就在i+1到j-1中。枚举这个点,然后求分开的两个小部分即可。显然可以从i和j之间的距离从小到大递推dp,也可以用记忆化搜索的递归形式(我的代码采用后者)。

因为任意多边形都有三角剖分,所以如果是凹的咋办?想了一下就用这种思路即可,只是每次枚举的时候判断一下该点是否成立(是否会经过多边形外的地方)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define clr(s,t) memset(s,t,sizeof(s))
#define INF 0x3fffffff
#define N 305
struct point{
    int x,y;
}stack[N],s[N],start;
int n,p,dp[N][N],w[N][N];
int dist(point a,point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int multi(point a,point b,point c){
    return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
}
int cmp(point a,point b){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值