新年趣事之红包--"四边形"不等式优化DP
目录
新年趣事之红包
时间限制: 1 Sec 内存限制: 64 MB
题目描述
xiaomengxian一进门,发现外公、外婆、叔叔、阿姨……都坐在客厅里等着他呢。经过仔细观察,xiaomengxian发现他们所有人正好组成了一个凸多边形。最重要的是,他们每个人手里都拿着一个红包(^o^)。于是非常心急,xiaomengxian决定找一条最短的路线,拿到所有的红包。 假设屋里共有N个人拿着红包,把他们分别从1到N编号。其中,编号为1的人就坐在大门口,xiaomengxian必须从这里出发去拿红包。一条合法的路线必须经过所有的点一次且仅一次。
输入
第一行为一个整数N(1<=N<=800)。 以下N行,每行两个实数Xi,Yi,表示该点的坐标。 各个点按照逆时针顺序依次给出。
输出
一个实数,表示最短的路线长度(保留三位小数)。
思路
此题在数据 / OJ 差的情况下,是可以用鬼贪心卡过的。但是这毕竟不是正解,正如标题上说的,要用动态规划求解,还要用“四边形不等式”来优化DP,其实,要是不用四边形不等式,还想不出是DP方法呢。
首先,
题目中说了,所有人正好组成了一个凸多边形,所以,题目是在提示我们,要用到凸多边形的性质。就拿四边形举例吧。
我们会发现,它的边长是符合四边形不等式的!
即 AD + BC > AB + CD
我们若从任意一点(A)出发,要最终走出一条最短路的话,先走对角线(AD)是不可取的,因为根据路径的特点,这样最终总会走过另一条不优的对角线(BC),与其如此,还不如先走一条与之相连的边(AB),最终的路径才可能是最优的 。
可以根据三角形三边关系去证明。
同理,
再看一个多边形。
从一个顶点A出发,若是走对角线,那么下一步只能走C或D,那么最后总会连一条不优的对角线交叉。
也就是说,在一个多边形的一点开始,第一步只能走相邻点。
整条路就可以用DP来解决。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#define min(x,y) (x < y ? x : y)
using namespace std;
int read() {
int f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
int n,m,i,j,k,s,o,t;
double x[805],y[805],dp[805][805][2],ans;
double HF(int a,int b) {
return sqrt(pow(x[a] - x[b],2) + pow(y[a] - y[b],2));
}
double DP(int l,int r,int f) {
if(dp[l][r][f] > 0.0) return dp[l][r][f];
if(l == r) return 0.0;
int u = l + 1,v = l - 1;
if(u > n) u = 1; if(v < 1) v = n;
if(f) dp[l][r][f] = min(HF(l,u) + DP(u,r,1),HF(l,r) + DP(r,u,0));
else dp[l][r][f] = min(HF(l,v) + DP(v,r,0),HF(l,r) + DP(r,v,1));
return dp[l][r][f];
}
int main() {
n = read();
for(i = 1;i <= n;i ++) {
scanf("%lf%lf",&x[i],&y[i]);
}
ans = DP(1,n,1);
for(i = 2;i <= n;i ++) {
ans = min(ans,DP(i,i - 1,1));
}
printf("%.3lf",ans);
return 0;
}
新年趣事之红包--"四边形"不等式优化DP的更多相关文章
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- codevs3002石子归并3(四边形不等式优化dp)
3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm 时间限制: 1 s 空间限制: 256000 KB 题目等级 ...
- CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性
LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- 四边形不等式优化DP——石子合并问题 学习笔记
好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...
- POJ 1160 四边形不等式优化DP Post Office
d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...
- BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
随机推荐
- 2020.10.24【普及组】模拟赛C组 总结
T1:暴力 1:先从 6 个中选三个,再把选出的三个全排列,全排列后再判断是否可行 2:把 6 个全都全排列,然后判断 T2:判断误差 1:减法时结果加上 1e-8 2:把小数乘上 1e6 左右 考试 ...
- c++ 超大整数除法 高精度除法
c++ 超大整数除法 高精度除法 解题思路 计算a/b,其中a为大整数,b为普通整数,商为c,余数为r. 根据手算除法的规则,上一步的余数记为r,则本次计算的被除数为t=r*10+被除数的本位数值a[ ...
- VTK 截图
vtk的vtkRenderWindowInteractor中的Initialize函数初始化了可交互的窗口,但是实际工程中,往往需要把窗口拿出来在别的页面上显示,如存为png图片等等.本文主要介绍如何 ...
- 10分钟快速部署camunda BPM开源版
安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...
- C语言学习之我见-malloc和free内存申请及释放函数
malloc函数负责向计算机申请确定大小的内存空间. free函数负责释放malloc的申请空间. (1)函数原型 void free(void *_Memory); void * malloc(si ...
- Vue回炉重造之router路由(更新中)
安装vue-router npm i vue-router -S 配置1.创建文件夹与文件 创建一个router文件夹,在文件夹中创建两个文件,分别是router.js和routes.js文件.2.编 ...
- Windows下MySQL的安装和删除
Windows下MySQL的安装和删除 安装Mysql 1 下载mysql 地址 2 安装教程 2.1配置环境变量 变量名:MYSQL_HOME 变量值:D:\software\programming ...
- Aspose最新版文档格式转换使用破解
Aspose简介 Aspose.Total是Aspose公司旗下全套文件格式处理解决方案,提供最完整.最高效的文档处理解决方案集,无需任何其他软件安装和依赖.主要提供.net.java.C++d三个开 ...
- DNS 系列(二):DNS 记录及工作方式,你了解吗?
在上一篇<DNS 系列(一):为什么更新了 DNS 记录不生效?>中,我们主要讲解了 DNS 和 DNS 传播,知道了网络通信主要通过 IP 地址来进行,而域名系统(DNS)则是保证用户在 ...
- samba打开一个文件的函数调用栈
ceph_open cephwrap_open open_fn smb_vfs_call_open SMB_VFS_OPEN fd_open fd_open_atomic open_file open ...