ZOJ 3537 Cake 【区间DP + 凸多边形三角剖分】

Cake

1

题意

给定平面坐标上的 n n n 个点,如果是凸多边形的话,就用最少的花费把这个多边形剖分成若干个三角形,剖分的线段端点只能是原多边形的顶点,一条线段的花费为: ∣ x i + x j ∣ × ∣ y i + y j ∣ m o d p |x_i + x_j| \times |y _i + y_j| mod p xi+xj×yi+yjmodp

思路

首先我们使用 A n d r e w Andrew Andrew 算法判断一下是否为凸包。对于当前的顶点 [ 0 , n − 1 ] [0, n - 1] [0,n1],我们先看一条边: 0 ↔ n − 1 0 \lrarr n - 1 0n1,这条边肯定属于某个三角形,我们肯定要有一条线的端点之一是 0 0 0,另外一条线的端点之一是 n − 1 n - 1 n1,并且这两条线有一个公共端点 k ( 1 ≤ k ≤ n − 2 ) k(1 \leq k \leq n - 2) k(1kn2),因为只有这样,才能将这条边剖分成属于某个三角形,而那两条线段就是三角形的两条边,第三条边就是 0 ↔ n − 1 0 \lrarr n - 1 0n1

那么这两条线就将我们的 [ 0 , n − 1 ] [0, n - 1] [0,n1] 区间的端点分成了两个部分: [ 0 , k ] [0, k] [0,k] [ k + 1 , n − 1 ] [k + 1, n - 1] [k+1,n1],这是两个子状态,我们可以使用 d p [ l ] [ r ] dp[l][r] dp[l][r] 表示区间 [ l , r ] [l,r] [l,r] 的三角剖分的最小花费

那么转移就可以枚举区间的分裂点 k k k

  • d p [ l ] [ k ] = m i n l + 1 ≤ k ≤ r − 1 ( d p [ l ] [ k ] + d p [ k + 1 ] [ r ] + c o s t ( l , k ) + c o s t ( k , r ) ) dp[l][k] = min_{l + 1 \leq k \leq r - 1} (dp[l][k] + dp[k + 1][r] + cost(l, k) + cost(k, r)) dp[l][k]=minl+1kr1(dp[l][k]+dp[k+1][r]+cost(l,k)+cost(k,r)) c o s t ( l , k ) cost(l,k) cost(l,k) 表示连接 l l l k k k 的花费

注意如果 l + 1 ≤ r l + 1 \leq r l+1r 时, c o s t ( l , r ) = 0 cost(l, r) = 0 cost(l,r)=0,因为原本的多边形上已经有了这条边,不用而外花费去切割

跑区间 D P DP DP 的时候,我们从长度为 3 3 3 的区间开始,长度小于等于 2 2 2 的区间花费都为 0 0 0,都不用切割

时间复杂度: O ( n 3 ) O(n^3) O(n3)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;int mod;struct Point{int x,y;Point(int xx=0,int yy=0){x=xx,y=yy;}Point operator + (Point B){ //向量 +return Point(x+B.x,y+B.y);}Point operator - (Point B){	//向量 -return Point(x-B.x,y-B.y);}Point operator * (int k){ //向量等比例放大return Point(k*x,k*y);}bool operator == (Point B){ //unique 用到return x-B.x == 0 && y-B.y == 0;}bool operator < (Point B){return x-B.x < 0 || (x-B.x == 0 && y-B.y < 0);}
};int Cross(Point A,Point B){return A.x*B.y - A.y*B.x;
}int Convex_hull(Point* p,int n,Point* ch){ //ch[]储存凸包顶点n = std::unique(p,p+n) - p;	//去重std::sort(p,p+n); //排序int v = 0;/* 求下凸包 */fore(i,0,n){while(v>1 && Cross(ch[v-1]-ch[v-2],p[i]-ch[v-2]) <= 0)--v;ch[v++] = p[i];}int j = v;/* 求上凸包 */for(int i=n-2;i>=0;--i){while(v>j && Cross(ch[v-1]-ch[v-2],p[i]-ch[v-2]) <= 0)--v;ch[v++] = p[i];}if(n>1)	--v; //p[0]被加入了两次return v; //返回凸包顶点数
}Point p[500];
Point ch[500];int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n;while(std::cin >> n >> mod){fore(i, 0, n) std::cin >> p[i].x >> p[i].y;if(Convex_hull(p, n, ch) < n){ //不是凸包std::cout << "I can't cut.\n";continue;}if(n <= 3){std::cout << "0\n";continue;}std::vector<std::vector<int>> dp(n + 5, std::vector<int>(n + 5, INF));std::vector<std::vector<int>> dis(n + 5, std::vector<int>(n + 5, 0)); //连接两个顶点的costauto cal = [&](int i, int j) { //计算costreturn std::abs(ch[i].x + ch[j].x) * std::abs(ch[i].y + ch[j].y) % mod;};fore(i, 0, n)fore(j, i + 2, n)dis[i][j] = dis[j][i] = cal(i, j); //预计算costfore(i, 0, n) dp[i][i + 1] = 0;fore(len, 3, n + 1)fore(L, 0, n - len + 1){int R = L + len - 1;fore(k, L + 1, R)dp[L][R] = std::min(dp[L][R], dp[L][k] + dp[k][R] + dis[L][k] + dis[k][R]);}std::cout << dp[0][n - 1] << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署一个在线OCR工具

效果 安装 1.拉取镜像 # 从 dockerhub pull docker pull mmmz/trwebocr:latest 2.运行容器 # 运行镜像 docker run -itd --rm -p 10058:8089 --name trwebocr mmmz/trwebocr:latest 使用 打开浏览器输入 http://192.168.168.110:10058/ 愉快滴使用吧

亚马逊认证考试系列 - 知识点 - LightSail介绍

一、引言 在当今云计算的时代&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;已成为业界领先的云服务提供商。其中&#xff0c;LightSail服务是AWS为简化云计算的入门和使用而推出的一项服务。它特别适合那些想要快速搭建网站、开发环境或小型应用的用户。通过LightSa…

Android Graphics 图像显示系统 - 开篇

“ 随着学习的不断深入和工作经验的积累&#xff0c;欲将之前在博客中整理的Android Graphics知识做进一步整理&#xff0c;并纠正一些理解上的错误&#xff0c;故开设Graphics主题系列文章 ” 序言 由于工作需要&#xff0c;也源于个人兴趣&#xff0c;终于下决心花时间整理一…

网络请求库axios

一、认识Axios库 为什么选择axios? 功能特点: 在浏览器中发送 XMLHttpRequests 请求在 node.js 中发送 http请求支持 Promise API拦截请求和响应转换请求和响应数据 补充: axios名称的由来? 个人理解没有具体的翻译. axios: ajax i/o system 二、axios发送请求 1.axios请求…

【开源】SpringBoot框架开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

2024 年 5 款适用于免费 iPhone 数据恢复的工具软件

搜索一下&#xff0c;你会发现许多付费或免费的iPhone数据恢复工具声称它们可以帮助你以很高的成功率找回所有丢失的数据。然而&#xff0c;这正是问题所在。真的很难做出选择。为了进一步帮助您解决数据丢失问题&#xff0c;我们在此列出了 5 款最好的免费 iPhone 恢复软件供您…

滑块识别验证

滑块识别 1. 获取图片 测试网站&#xff1a;https://www.geetest.com/adaptive-captcha-demo 2. 点击滑块拼图并开始验证 # 1.打开首页 driver.get(https://www.geetest.com/adaptive-captcha-demo)# 2.点击【滑动拼图验证】 tag WebDriverWait(driver, 30, 0.5).until(la…

Python API的使用简述

文章目录 Web APIGit 和 GitHub使用 API 调用请求数据安装 requests处理响应 API处理响应字典监视API的速率限制使用 Pygal 可视化仓库改进Pygal图表添加自定义工具提示 本篇文章&#xff1a;我们叙述如何编写一个独立的程序&#xff0c;并对其获取的数据进行可视化。这个程序将…

Eclipse导入maven项目或者创建maven项目时,报错Could not calculate build plan: Plugin

问题&#xff1a;Eclipse导入maven项目或者创建maven项目时,报错Could not calculate build plan: Plugin 1.上述问题大概是项目不能加载此maven插件&#xff0c;在pom文件中添加依赖项 <dependency><groupId>org.apache.maven.plugins</groupId><artifa…

二级建造师试题答案?学生党都在用的6款搜题工具来了 #学习方法#学习方法#微信

作为大学生&#xff0c;我们应该善于利用各种学习工具&#xff0c;提高学习效率和质量。 1.灵兔搜题 这是一个公众号 包含大学网课、课后教材、选修课、mooc慕课及各类职业资格证、学历提升考试、公务员考试等常见题库。 下方附上一些测试的试题及答案 1、Uri主要由三部分组…

Python实战:用Python程序实现春晚刘谦魔术

刘谦春晚魔术是一个让人叹为观止的魔术表演&#xff0c;其中涉及到了数学、编程和创意的结合。看了春晚魔术的朋友们&#xff0c;是不是好奇春晚刘谦的魔术是怎么变的。 在这篇文章中&#xff0c;我们将通过 Python 程序实现春晚刘谦魔术&#xff0c;让读者对这个魔术有更深入…

【GAMES101】Lecture 20 光场

目录 光场&#xff08;Light Field / Lumigraph&#xff09; 广场照相机 光场&#xff08;Light Field / Lumigraph&#xff09; 我们在三维的世界中从一个观测点出发看到这么一幅二维的画面 如果有这么一副画布可以完美的显示出从观察点看到的画面&#xff0c;那用这幅画布…

idea设置terminal为git

要在IntelliJ IDEA中设置终端为Git Bash&#xff0c;请按照以下步骤操作&#xff1a; 打开 Settings&#xff08;设置&#xff09;。点击 Tools&#xff08;工具&#xff09;选项卡。进入 Terminal&#xff08;终端&#xff09;界面。在 Shell Path 下选择 Browse&#xff08;…

Redis发布订阅及事务管理

目录 一、发布订阅 1.1、常用命令 1.2、示例演示 二、事务管理 2.1 Multi、Exec、Discard 2.2 示例演示 2.3 事务的错误处理 2.4 事务的冲突问题 2.4.1 事务场景 2.4.2 悲观锁 2.4.3 乐观锁 2.4.4 事务解决冲突—WATCH 2.4.5 UNWATCH 2.4.6 Redis事务的三个特性 …

ES实战-book笔记1

#索引一个文档,-XPUT手动创建索引, curl -XPUT localhost:9200/get-together/_doc/1?pretty -H Content-Type: application/json -d {"name": "Elasticsearch Denver","organizer": "Lee" } #返回结果 {"_index" : "g…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

【GAMES101】Lecture 20 颜色

目录 光 颜色 加色系统 CIE RGB颜色匹配实验 颜色空间 CIE XYZ颜色空间 HSV颜色空间(Hue-Saturation-Value) CIELAB空间 减色系统&#xff1a;CMYK 光 光是由不同波长的光波组成的&#xff0c;其中可见光的波长范围在400nm到700nm 用谱功率密度&#xff08;Spectral…

Low 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录&#xff0c;找到反射型 XSS 页面&#xff08;笔者这里是 Low 级别&#xff09; 先…

图像处理之《鲁棒图像隐写术:隐藏频率系数中的信息》论文精读

一、文章摘要 隐写术是一种将秘密信息隐藏到公共多媒体对象中而不会引起第三方怀疑的技术。然而&#xff0c;大多数现有的工作不能提供良好的抗有损JPEG压缩鲁棒性&#xff0c;同时保持相对较大的嵌入容量。提出了一种基于可逆神经网络的端到端鲁棒隐写系统。该方法将秘密信息…

医学搜题神器找答案? #知识分享#职场发展

大学生必备的搜题工具&#xff0c;专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索&#xff0c;每道题目都有详细的讲解&#xff0c;每个都堪称大学神器。 1.题小聪 这是一个公众号 它支持文本搜索、扫码搜书、拍照搜索&#xff0c;不会的题目直接对…