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 ...
随机推荐
- 自助Linux之问题诊断工具strace【转】
转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- GHOST分区丢失只剩C盘
很多人装系统时会经常会使用GHOST来恢复自己的系统,当WINDOWS系统出现意外时,再用GHOST的“From Image to 分区”来对系统进行恢复,这样就可以省去繁琐耗时的重新安装操作系统的工 ...
- kafka系列二、kafka manager的安装和使用
1. Yahoo kafka manager介绍 项目地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or ...
- 【转】通过xml处理sql语句时对小于号与大于号的处理转换
当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...
- shell无法捕获程序输出的问题
dir_name=`echo ~gtp` 获取的用户目录为/ dir_name=`echo ~gtp 2>&1` 这样就可以获取到了 参考网址:https://blog.csdn.net ...
- 【转】理解*(void**)
#include <stdio.h> int main() { int *p; ; unsigned ; p = &a; printf("%d\n", *p); ...
- C++:__stdcall详解
原文地址:http://www.cnblogs.com/songfeixiang/p/3733661.html 对_stdcall 的理解(上)在C语言中,假设我们有这样的一个函数:int funct ...
- eclipse自定义工具栏
设置:1.Window2.Customize Perspective说明:Tool Bar Visibility定义菜单栏,Shortcuts定义右键new菜单
- centos7.2环境下安装smokeping对网络状态进行监控
centos7.2环境下安装smokeping对网络状态进行监控 安装smokeping建议用centos7,用centos6.5一直卡在smokeping那里,下载不了perl的扩展插件,可能是因为 ...
- shell脚本收集服务器基本信息并入库
# cat check_all.sh #!/bin/bash #create by hexm @2016.6 #date=`date +%Y%m%d` #DIST_FILE=/app/healthch ...