[HDU3516] Tree Construction [四边形不等式dp]
题面:
思路:
这道题有个结论:
把两棵树$\left[i,k\right]$以及$\left[k+1,j\right]$连接起来的最小花费是$x\left[k+1\right]-x\left[i\right]+y\left[k\right]-y\left[j\right]$
然后就明显可以区间dp了
设$dp\left[i\right]\left[j\right]$表示把闭区间$\left[i,j\right]$中的点连起来的最小花费,然后定义上面那个最小花费为$w\left(i,k,j\right)$
那么转移方程就比较显然了:
$dp\left[i\right]\left[j\right]=min\left(dp\left[i\right]\left[k\right]+dp\left[k+1\right]\left[j\right]+w\left(i,k,j\right)\right)$
证明一下可以看出,$w$函数在$k$不变的时候,是满足四边形不等式的
因此可以给$dp$套一个优化,在$O\left(n^2\right)$中解决
这道题目的重难点实际上就是求$w\left(i,k,j\right)$的表达式,求出来就很显然了
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e9
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,x[],y[],dp[][],s[][];
int w(int l,int mid,int r){
return x[mid+]-x[l]+y[mid]-y[r];
}
int main(){
int i,j,len,tmp,k;
while(~scanf("%d",&n)){
for(i=;i<=n;i++) x[i]=read(),y[i]=read();
for(i=;i<=n;i++) dp[i][i]=,s[i][i]=i;
for(len=;len<n;len++){
for(i=;i<=n;i++){
j=len+i;if(j>n) break;
dp[i][j]=inf;
for(k=s[i][j-];k<=s[i+][j]&&k<j;k++){
if((tmp=dp[i][k]+dp[k+][j]+w(i,k,j))<dp[i][j]){
dp[i][j]=tmp;s[i][j]=k;
}
}
}
}
printf("%d\n",dp[][n]);
}
}
[HDU3516] Tree Construction [四边形不等式dp]的更多相关文章
- hdu3516 Tree Construction (四边形不等式)
题意:给定一些点(xi,yi)(xj,yj)满足:i<j,xi<xj,yi>yj.用下面的连起来,使得所有边的长度最小? 题解:直接给出吧 f[i][j]=min(f[i][k]+f ...
- HDU 3516 Tree Construction (四边形不等式)
题意:给定一些点(xi,yi)(xj,yj)满足:i<j,xi<xj,yi>yj.用下面的连起来,使得所有边的长度最小? 思路:考虑用区间表示,f[i][j]表示将i到j的点连起来的 ...
- HDOJ 3516 Tree Construction 四边形优化dp
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意: 大概就是给你个下凸包的左侧,然后让你用平行于坐标轴的线段构造一棵树,并且这棵树的总曼哈顿 ...
- hdu3516 Tree Construction (区间dp+四边形优化)
构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...
- 【整理】石子合并问题(四边形不等式DP优化)
有很多种算法: 1,任意两堆可以合并:贪心+单调队列. 2,相邻两堆可合并:区间DP (O(n^3)) ). 3,相邻,四边形不等式优化DP (O(n^2) ). 4,相邻,GarsiaWach ...
- [HDU3480] Division [四边形不等式dp]
题面: 传送门 思路: 因为集合可以无序选择,所以我们先把输入数据排个序 然后发先可以动归一波 设$dp\left[i\right]\left[j\right]$表示前j个数中分了i个集合,$w\le ...
- [POJ1160] Post Office [四边形不等式dp]
题面: 传送门 思路: dp方程实际上很好想 设$dp\left[i\right]\left[j\right]$表示前$j$个镇子设立$i$个邮局的最小花费 然后状态转移: $dp\left[i\ri ...
- 记忆的轮廓 期望 四边形不等式dp|题解
记忆的轮廓 题目描述 通往贤者之塔的路上,有许多的危机.我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增,在[1,n]中,一共有n个节点.我们把编 ...
- hdu3516 Tree Construction
Problem Description Consider a two-dimensional space with a set of points (xi, yi) that satisfy xi & ...
随机推荐
- 人脸验证算法Joint Bayesian详解及实现(Python版)
人脸验证算法Joint Bayesian详解及实现(Python版) Tags: JointBayesian DeepLearning Python 本博客仅为作者记录笔记之用,不免有很多细节不对之处 ...
- python 多进程简单调用
python 多进程简 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/28 10:03 # so ...
- 题解 P1137 【旅行计划】
传送门 很显然,每个点的答案是它所有前驱节点的答案加1,即f[i]=max(f[i],f[j]+1); 考虑空间复杂度用邻接表存图,在拓扑排序同时DP就好了 #include<iostream& ...
- char的有无符号类型
char 分为有符号性(signed)和无符号型(unsigned)两种: Ø若是signed型,就意味着取值范围为[-128,127]: Ø若是unsigned型,就意味着取值范围为[0,255]: ...
- Activiti学习记录(五)
1.排他网关 说明: 1) 一个排他网关对应一个以上的顺序流 2) 由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果. 3) 决策网关 ...
- 使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因
公司的产品一直紧跟 .net core 3.0 preview 不断升级, 部署到 Linux 服务器后, 偶尔会出现某个进程CPU占用100%. 由于服务部署在云上, 不能使用远程调试; 在局域网内 ...
- day 44 前端HTML
前端HTML HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk ...
- Codeforces Round #460 (Div. 2)-D. Substring
D. Substring time limit per test3 seconds memory limit per test256 megabytes Problem Description You ...
- 记忆化搜索:POJ1088-滑雪(经典的记忆化搜索)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...
- 8、python中的集合
集合是python中无序.可变的数据结构.集合与字典类似,集合中的元素必须是可哈希的(等同于字典中的键),也就是说集合中的元素是唯一.不可变的数据类型.这里前面说集合可变,后面又说集合中的元素不可变是 ...