【HDOJ】【3516】Tree Construction
DP/四边形不等式
这题跟石子合并有点像……
dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价。
易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[k+1][j-(k-i+1)]+w(i,k,j)}
(这个地方一开始写错了……)
即,将一棵树从k处断开成(i,k)和(k+1,i+j-1)两棵树,再加上将两棵树连起来的两条树枝的长度w(i,k,j)
其中,$ w(i,k,j)=x[k+1]-x[i]+y[k]-y[i+j-1] $
那么根据四边形不等式易知 $s[i][j-1] \leq k \leq s[i+1][j-1] $
如果觉得上面那种不好懂,那我们来看个好懂的:
dp[i][j]表示将第 i 个点到第 j 个点合并的最小代价。
易知有 dp[i][j]=min{ dp[i][j],dp[i][k]+dp[k+1][j]+w(i,k,j) }
即,将一棵树从k处断开成(i,k)和(k+1,j) 两棵树,再加上将两棵树连起来的两条树枝的长度w(i,k,j)
w(i,k,j)的定义与上同
那么根据四边形不等式易知 $s[i][j-1] \leq k \leq s[i+1][j] $
其实,两种表示方法是一样的,递推时都按照区间长度为阶段进行递推(想一想,第二种中 (i,j-1) 和 (i+1,j) 的长度是不是 都是(i,j)的长度-1?)
只是第二种写法的方程看上去好看,也好写……sigh那我写第一种干嘛T_T算了不改了
反正基本就是石子合并的原题啦~除了w函数的定义不同……
//HDOJ 3516
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
const double eps=1e-;
/*******************template********************/
//#define debug
int x[N],y[N],dp[N][N],s[N][N];
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
int n;
while(scanf("%d",&n)!=EOF){
F(i,,n) x[i]=getint(),y[i]=getint();
F(i,,n){
dp[i][]=;
s[i][]=i;
}
F(i,,n-){
dp[i][]=x[i+]-x[i]+y[i]-y[i+];
s[i][]=i;
}
#ifdef debug
F(i,,n-) printf("%d ",dp[i][]);
printf("\n");
#endif
F(j,,n)
F(i,,n-j+){
dp[i][j]=INF;
F(k,s[i][j-],s[i+][j-]){
int tmp=y[k]-y[i+j-]+x[k+]-x[i]+dp[i][k-i+]+dp[k+][j-(k-i+)];
#ifdef debug
printf("i=%d k=%d j=%d\n",i,k,j);
printf("dp[i][k-i+1]=%d dp[k+1][j-k]=%d\n",dp[i][k-i+],dp[k+][j-k]);
#endif
if (tmp<dp[i][j]){
s[i][j]=k;
dp[i][j]=tmp;
}
}
}
#ifdef debug
F(j,,n){
F(i,,n) printf("%d ",dp[i][j]);
printf("\n");
}
F(j,,n){
F(i,,n) printf("%d ",s[i][j]);
printf("\n");
}
#endif
printf("%d\n",dp[][n]);
}
return ;
}
(156MS 9076K)
【HDOJ】【3516】Tree Construction的更多相关文章
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147
以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
- CF 675D——Tree Construction——————【二叉搜索树、STL】
D. Tree Construction time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【题解】【BT】【Leetcode】Binary Tree Preorder/Inorder/Postorder (Iterative Solution)
[Inorder Traversal] Given a binary tree, return the inorder traversal of its nodes' values. For exam ...
- 【BZOJ2959】长跑(Link-Cut Tree,并查集)
[BZOJ2959]长跑(Link-Cut Tree,并查集) 题面 BZOJ 题解 如果保证不出现环的话 妥妥的\(LCT\)傻逼题 现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一 ...
- 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)
[BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- 【BZOJ2588】Count On a Tree(主席树)
[BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...
随机推荐
- WinForm中为按钮添加键盘快捷键,超简单,亲测有效
博主并没有多少Windows平台下程序的开发经验,一年前使用过MFC设计过一个指纹识别系统的页面,后来就没有使用过几次.现在C#课程实验要求实现一个简易计算器,为了便于快速录入数据,使用键盘会比使用鼠 ...
- SQL中迁移sql用户及密码脚本
SQL中迁移sql用户及密码脚本 编写人:CC阿爸 2014-6-20 在日常SQL数据库的操作中,常常需要迁移数据库或重装服务器,这时候,一些之前建立的login账户,必须重新建立,以下可以通过 ...
- jMeter 监控cpu、内存
http://jmeter-plugins.org/downloads/all/ 将JMeterPlugins.jar包复制到Jmeter的lib目录下面的ext目录下面,重新启动Jmeter,我们点 ...
- python zip函数介绍
首先用help(zip)来看一下帮助文档:
- 7.css盒模型
所谓的盒模型,其实就是把元素当成盒子,元素里的文本就是盒子里的东西. 而根据元素的特效,其盒模型的特效也不同,下面是一些总结: 1.块级元素(区块) 所谓块级元素,就是能够设置元素尺寸.有隔离其他元素 ...
- 使用Telerik控件搭建Doubanfm频道部分
今天感觉好累啊..还是坚持记录下. 收集的API: https://github.com/HakurouKen/douban.fm-api https://github.com/zonyitoo/do ...
- Mybatis 实现传入参数是表名
<select id="totals" resultType="string"> select count(*) from ${table} < ...
- SQL 集合(笔记)
——SQL是关于集合的 oracle是关系型数据,其中的数据表都是有一定规律的数据的一个个集合,所以在使用SQL时,如果能按照集合的思路来进行时会节省很多效率,也鞥让语句更加的清晰明了. 1.四个集合 ...
- Android--获取使用的总流量和每个App的上传、下载的流量
获得每个App的上传.下载的流量. 思路就是获取到我们手机上的所有app,再获得app里面使用的权限,如果app有网络权限,就显示出来. 代码很简单,代码里面也有比较详细的注释,下面直接上代码 布局文 ...
- hdu 4217 Data Structure?/treap
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...