http://acm.hdu.edu.cn/showproblem.php?pid=3516

题意:平面n个点且满足xi<xj, yi>yj, i<j。xi,yi均为整数。求一棵树边只能向上和向右延展的经过所有点的最小长度。(n<=1000, 0<=xi, yi<=10000)

#include <cstdio>
using namespace std;
const int N=1005, oo=~0u>>1;
int d[N][N], x[N], y[N], n, s[N][N];
int main() {
while(~scanf("%d", &n)) {
for(int i=1; i<=n; ++i) scanf("%d%d", &x[i], &y[i]);
for(int i=1; i<n; ++i) d[i][i+1]=y[i]-y[i+1]+x[i+1]-x[i], s[i][i+1]=i+1;
for(int len=3; len<=n; ++len)
for(int i=1; i<=n-len+1; ++i) {
int j=i+len-1, l=s[i][j-1], r=s[i+1][j], &now=d[i][j], &pos=s[i][j];
now=oo;
for(int k=l; k<=r; ++k) {
int t=d[i][k-1]+d[k][j]+y[k-1]-y[j]+x[k]-x[i];
if(now>=t) {
now=t;
pos=k;
}
}
}
printf("%d\n", d[1][n]);
}
return 0;
}

  

一开始乱想= =乱搞无果= =b,于是妈呀看了题解 = =

妈呀我没想到.....d(i, j)表示i~j个点的最小代价,由于点都满足题目所给的条件,对于两棵i~k-1, k~j的树连接起来显然代价为y[k-1]-y[j]+x[k]-x[i]

设$w(i, j, k)=y[k-1]-y[j]+x[k]-x[i]$,那么得到:

$$d(i, j)=min \{ d(i, k-1)+d(k, j)+w(i, j, k) \}, i<j$$

我一开始看到$w$是三元的= =便又手推了一下四边形不等式的证明= =发现这竟然和$k$无关!即如果四边形不等式满足$w(i, j, k)+w(i', j', k) \le w(i', j, k)+w(i, j', k)$,那么和原来的一模一样!原因在哪?因为我是一个sb= =关于$w$的不等式左右加上两个$y[k-1]+x[k]$是可以约掉的我还傻x的重新证明了一下!

那么本题直接把状态变为$w(i, j)$先不管$k$了= =

我们先来证明$w$的区间单调性,很显然吧...题目已经满足= =

然后来证明$w$的四边形不等式....首先我们要一个容易证明不等式成立的式子= =

首先四边形不等式变形为

$$w(i, j')-w(i, j) \ge w(i', j')-w(i', j)$$

发现当$j$不变时(即固定),那么我们只需要判断$w(i, j')-w(i, j)$的$i$如果增大值是变大还是变小即可,如果是变小(递减)显然满足四边形不等式(因为$i' \ge i$)。

所以得到一个定理:如果$w(i, j)$满足四边形不等式,则我们只需要判断:当j不变时,$w(i, j+1)-w(i, j)$是否单调递减即可。(j同理,咦j要不要一起证啊?)

那么本题由于$w(i, j+1)-w(i, j) = y[j]-y[j+1]$与$i$无关所以满足条件...

那么水题啦= =

【HDU】3516 Tree Construction的更多相关文章

  1. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  2. 【BZOJ】2631: tree LCT

    [题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...

  3. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  4. 【题解】Digit Tree

    [题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...

  5. 【题解】[P4178 Tree]

    [题解]P4178 Tree 一道点分治模板好题 不知道是不是我见到的题目太少了,为什么这种题目都是暴力开值域的桶QAQ?? 问点对,考虑点分治吧.直接用值域树状数组开下来,统计的时候直接往树状数组里 ...

  6. 【总结】Link-Cut Tree

    这是一篇关于LCT的总结 加删边的好朋友--Link Cut Tree Link-Cut Tree,LCT的全称 可以说是从树剖引出的问题 树剖可以解决静态的修改或查询树的链上信息:那如果图会不断改变 ...

  7. 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交

    [题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...

  8. HDOJ 3516 Tree Construction

    四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  9. 【HDU】2191 多重背包问题

    原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...

随机推荐

  1. 在Win7 64位注册ActiveX控件

    首先必须以管理员身份运行cmd.exe,即在cmd.exe右键选择以管理员身份运行.    目前共有两个存在网络盘的文件需要注册,一个dll,一个ocx.    开始时将两个文件都拷贝到c:\wind ...

  2. Delphi面向对象的方法

    方法是属于一个给定对象的过程和函数,方法反映的是对象的行为而不是数据,前一篇提到的对象的两个重要的方法:构造方法和析构方法. 为了使对象能执行各种功能,你能在对象中定制方法 创建一个方法用两个步骤,首 ...

  3. Spell checker

     Spell checker Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  4. Async/Await 最佳实践

    其实好久以前就看过这个文章,以及类似的很多篇文章.最近在和一个新同事的交流中发现原来对async的死锁理解不是很透彻,正好最近时间比较充裕就再当一回搬运工. 本文假定你对.NET Framework ...

  5. Android图像处理实例教程

    Android图像处理实例教程 原始出处 http://vaero.blog.51cto.com/4350852/856750

  6. javascript 的基础笔记

    新手入門: alert的使用:   在alert中\xB0可以输出温度(centigrade)的符号,\xNN可以输入一些不能输入的特殊字符,NN是两个十六进制数,表示字符在latin-1 字符集中的 ...

  7. VC 快速创建多层文件夹

    BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ); 这个是大多数用户都知道的 ...

  8. Process32First 返回FALSE的原因

    一般情况下是不会返回FALSE的,如果发生了,请检查: 1:系统为UNICODE的,一定要设置PROCESSENTRY32的dwSize为sizeof(PROCESSENTRY32)即可..

  9. 汇编指令CLI/STI

    CLI禁止中断发生STL允许中断发生 这两个指令只能在内核模式下执行,不可以在用户模式下执行:而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的 ...

  10. form表单验证和事件

    1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...