目录

题目描述

输入

输出

思路


新年趣事之红包

时间限制: 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的更多相关文章

  1. hdu 2829 Lawrence(四边形不等式优化dp)

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  2. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  3. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  4. codevs3002石子归并3(四边形不等式优化dp)

    3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm  时间限制: 1 s  空间限制: 256000 KB  题目等级 ...

  5. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  6. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

  7. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  8. 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)的值是可以预处理出来的. 下 ...

  9. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

随机推荐

  1. AtCoder ABC 250 总结

    AtCoder ABC 250 总结 总体 连续若干次一样的结果:30min 切前 4 题,剩下卡在 T5 这几次卡在 T5 都是一次比一次接近, 什么 dp 前缀和打挂,精度被卡,能水过的题连水法都 ...

  2. Docker容器编译安装Redis

    Docker容器编译安装Redis 1.创建容器 -i 交互模式 -d 后端运行 -h 容器的hostname --name 容器名 --network 网卡 --ip IP地址 -p 端口映射 -- ...

  3. Node.js精进(2)——异步编程

    虽然 Node.js 是单线程的,但是在融合了libuv后,使其有能力非常简单地就构建出高性能和可扩展的网络应用程序. 下图是 Node.js 的简单架构图,基于 V8 和 libuv,其中 Node ...

  4. SAP 动态选择屏幕实例

    DATA:BEGIN OF gs_sel, werks TYPE marc-werks, "工厂 matnr TYPE mara-matnr, "物料 mtart TYPE mar ...

  5. CMU15445 之 Project#0 - C++ Primer 详解

    前言 这个实验主要用来测试大家对现代 C++ 的掌握程度,实验要求如下: 简单翻译一下上述要求,就是我们需要实现定义在 src/include/primer/p0_starter.h 中的三个类 Ma ...

  6. rhel安装程序

    Linux下软件分类     rpm软件包,包管理器 yum     deb软件包,包管理器 apt     源代码软件包            一般为".tar.gz".&quo ...

  7. Node.js精进(6)——文件

    文件系统是一种用于向用户提供底层数据访问的机制,同时也是一套实现了数据的存储.分级组织.访问和获取等操作的抽象数据类型. Node.js 中的fs模块就是对文件系统的封装,整合了一套标准 POSIX ...

  8. 基于springBoot项目如何配置多数据源

    前言 有时,在一个项目中会用到多数据源,现在对自己在项目中多数据源的操作总结如下,有不到之处敬请批评指正! 1.pom.xml的依赖引入 <dependency> <groupId& ...

  9. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  10. Spring 核心概念

    Spring 核心概念 引言 本文主要介绍 Spring 源码中使用到的一些核心类 1. BeanDefinition BeanDefinition表示Bean定义,BeanDefinition 中存 ...