HDOJ 3516 Tree Construction 四边形优化dp
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3516
题意:
大概就是给你个下凸包的左侧,然后让你用平行于坐标轴的线段构造一棵树,并且这棵树的总曼哈顿距离最短
题解:
很容易得到转移方程:
$$dp[i][j]=min \{ dp[i][k-1]+dp[k][j] + dis(uni(i,k-1),uni(k,j))\}$$
其中$dp[i][j]$表示从$i$到$j$的最优解,$dis(i,j)$表示$i$和$j$之间的曼哈顿距离,$uni(i,j)$表示将$i$和$j$用平行于坐标轴的线段连在一起时的拐角点。
然后可以证明这是满足四边形优化条件的。
然后四边形优化一下就好。
代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#include<climits>
#include<cmath>
#define MAX_N 1234
#define INF LLONG_MAX/1234
using namespace std; typedef long long LL; LL dp[MAX_N][MAX_N]; int n; struct point {
public:
LL x, y; point(LL xx, LL yy) : x(xx), y(yy) { } point() { }
}; point P[MAX_N]; LL dis(point a,point b){
return abs(a.x-b.x)+abs(a.y-b.y);
} point uni(point a,point b) {
return point(min(a.x, b.x), min(a.y, b.y));
} int s[MAX_N][MAX_N]; int main() {
cin.sync_with_stdio(false);
while (cin >> n) {
for (int i = ; i <= n; i++)
cin >> P[i].x >> P[i].y;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) {
if (i == j)
dp[i][j] = ;
else
dp[i][j] = INF;
}
for (int i = ; i < n; i++)
dp[i][i + ] = dis(P[i], P[i + ]), s[i][i + ] = i + ;
for (int t = ; t <= n; t++)
for (int i = ; i + t <= n; i++) {
int j = i + t;
int pos = ;
for (int k = s[i][j - ]; k <= s[i + ][j]; k++)
if (dp[i][j] > dp[i][k - ] + dp[k][j]+ dis(uni(P[i], P[k - ]), uni(P[k], P[j])))
dp[i][j] = dp[i][k - ] + dp[k][j] + dis(uni(P[i], P[k - ]), uni(P[k], P[j])), pos = k;
s[i][j] = pos;
}
cout << dp[][n] << endl;
}
return ;
}
HDOJ 3516 Tree Construction 四边形优化dp的更多相关文章
- HDOJ 3516 Tree Construction
四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- [HDU3516] Tree Construction [四边形不等式dp]
题面: 传送门 思路: 这道题有个结论: 把两棵树$\left[i,k\right]$以及$\left[k+1,j\right]$连接起来的最小花费是$x\left[k+1\right]-x\left ...
- HDU 3516 Tree Construction (四边形不等式)
题意:给定一些点(xi,yi)(xj,yj)满足:i<j,xi<xj,yi>yj.用下面的连起来,使得所有边的长度最小? 思路:考虑用区间表示,f[i][j]表示将i到j的点连起来的 ...
- HDU 2829 Lawrence(四边形优化DP O(n^2))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ...
- HDU 3516 Tree Construction
区间$dp$,四边形优化. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio&g ...
- HDU.3516.Tree Construction(DP 四边形不等式)
题目链接 贴个教程: 四边形不等式学习笔记 \(Description\) 给出平面上的\(n\)个点,满足\(X_i\)严格单增,\(Y_i\)严格单减.以\(x\)轴和\(y\)轴正方向作边,使这 ...
- hdu2829 四边形优化dp
Lawrence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 【HDU】3516 Tree Construction
http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意:平面n个点且满足xi<xj, yi>yj, i<j.xi,yi均为整数.求一棵树边 ...
- 四边形优化dp
理解: http://blog.renren.com/share/263498909/1064362501 http://www.cnblogs.com/ronaflx/archive/2011/03 ...
随机推荐
- loadrunner 欺骗ip设置
工具准备:loadrunner12,windows 10 ip欺骗=ip wizard 前提条件:本机IP地址为固定地址,不是自动获取的地址 方法: 1.管理员身份打开cmd 2.输入命令:confi ...
- python3知识点之---------列表的介绍
1.列表是什么? 它是由一系列特定顺序排序的元素组成.元素可以表示一切任何的事物,元素之间可以没有任何关系.列表用方括号[ ] 表示,元素之间由逗号隔开. 例如表示一系列数字的列表: numbe ...
- (笔记) RealTimeRender[实时渲染] C2
@author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...
- 聊聊、Mybatis API
API Mybatis 到底解决了什么问题,持久化框架是什么,没出现 Mybatis 之前我们又是怎么来操作数据库的呢?对于 Java语言 来说,JDBC标准 是比较底层的了,但并非最底层的,可以说 ...
- 台州学院maximum cow训练记录
前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...
- HDU 4436 str2int (后缀自动机)
把所有的字符串连接起来,中间用一个未出现的字符分隔开,题意是求这个串的所有子串(中间不含分隔符)形成的数之和. 把这个串加入SAM,对所有子串进行拓扑排序,从前往后统计. 记录到达这个节点的路径个数c ...
- JavaWeb笔记(十一)Maven
什么是Maven Maven是Apache旗下一款开源自动化的项目管理工具,它使用java语言编写,因此Maven是一款跨平台的项目管理工具. 主要功能 项目构建 在实际开发中,不仅仅是写完代码项目就 ...
- [洛谷P4889]kls与flag
题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第$i$根竹竿高度为$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...
- [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]
题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...
- [poj] 1375 Interval || 圆的切线&和直线的交点
原题 每组数据给出一些圆(障碍物)的圆心和半径,一个点和一条线段,求站在这个点,能开到的线段的部分的左端点和右端点.没有则输出"No View" 相当于求过该点的圆的两条切线,切线 ...