HDU.3516.Tree Construction(DP 四边形不等式)
贴个教程: 四边形不等式学习笔记
\(Description\)
给出平面上的\(n\)个点,满足\(X_i\)严格单增,\(Y_i\)严格单减。以\(x\)轴和\(y\)轴正方向作边,使这\(n\)个点构成一棵树,最小化树边边的总长。
\(Solution\)
考虑有两棵构造好的树,要合并这两棵树,要从右边的树中找一个最优点连到左边的树上
不难想到区间DP(真的想不到==)
\(f[i][j]\)表示将\([i,j]\)合并为一棵树的最小代价,那么有 \(f[i][j] = \min\{ f[i][k-1]+f[k][j]+cost(i,j,k) \}\)
\(cost(i,j,k)=X[k]-X[i]+Y[k-1]-Y[j]\) //ps: 当前左边树主干在 \(Xi\) 位置,且下部高度为 \(Y_{k-1}\),合并后下部应为 \(Yj\);另外肯定是拿右边树的最左上点合并啊
这个\(cost\)是三维的,证不了\(cost\)满足四边形不等式
那想下 决策应该是满足单调性的,即 \(P[i][j-1]\leq P[i][j]\leq P[i+1][j]\)
注意左端点应是\(\max(P[i][j-1],i+1)\)
\(f\)应该满足四边形不等式,不会证。
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=1005;
int n,X[N],Y[N],P[N][N],f[N][N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1; i<=n; ++i) X[i]=read(),Y[i]=read();
memset(f,0x3f,sizeof f);
for(int i=1; i<=n; ++i) P[i][i]=i, f[i][i]=0;
for(int tmp,i=n-1; i; --i)
for(int j=i+1; j<=n; ++j)
for(int k=std::max(P[i][j-1],i+1); k<=P[i+1][j]; ++k)
if(f[i][j]>(tmp=f[i][k-1]+f[k][j]+X[k]-X[i]+Y[k-1]-Y[j]))
f[i][j]=tmp, P[i][j]=k;
printf("%d\n",f[1][n]);
}
return 0;
}
HDU.3516.Tree Construction(DP 四边形不等式)的更多相关文章
- HDU 3516 Tree Construction (四边形不等式)
题意:给定一些点(xi,yi)(xj,yj)满足:i<j,xi<xj,yi>yj.用下面的连起来,使得所有边的长度最小? 思路:考虑用区间表示,f[i][j]表示将i到j的点连起来的 ...
- HDU 3516 Tree Construction
区间$dp$,四边形优化. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio&g ...
- CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- HDU 3516 DP 四边形不等式优化 Tree Construction
设d(i, j)为连通第i个点到第j个点的树的最小长度,则有状态转移方程: d(i, j) = min{ d(i, k) + d(k + 1, j) + p[k].y - p[j].y + p[k+1 ...
- 【HDU】3516 Tree Construction
http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意:平面n个点且满足xi<xj, yi>yj, i<j.xi,yi均为整数.求一棵树边 ...
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
- HDOJ 3516 Tree Construction
四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 2829 Lawrence(动态规划-四边形不等式)
Lawrence Problem Description T. E. Lawrence was a controversial figure during World War I. He was a ...
随机推荐
- Python之matplotlib库学习
matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory order
1.前言 2.基本概念 Observer 可以发起对memory read/write访问的都是observer; Observability 是一种观察能力,通过read可以感知到别的observe ...
- Hacker需要掌握的基础
编译语言:1.C语言能力要求:精通选用教材:<C Primer Plus 中文版(第5版)>其他教材:<标准C程序设计(第3版)><C语言入门经典(原书第3版)>补 ...
- BIM 相关资料
BIM 相关资料:http://pan.baidu.com/share/link?shareid=919219072&uk=966240844
- ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- Cookie/Session机制详解(转载)
原文链接:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...
- 如何在DOS窗口复制和粘贴命令
在键盘上按下windows+R键,打开运行窗口. 在“打开”处输入cmd,并按下enter键,打开DOS窗口. 把鼠标移动到DOS窗口标题处,单击鼠标右键,选择属性. 把编辑选项处的“快速编辑模式”勾 ...
- UDP template 代码
服务端 from socket import * import json,struct client= socket(AF_INET,SOCK_STREAM) client.connect(('127 ...
- LeetCode(9):回文数
Easy! 题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: f ...