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的更多相关文章

  1. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  2. 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147

    以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. CF 675D——Tree Construction——————【二叉搜索树、STL】

    D. Tree Construction time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  6. 【题解】【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 ...

  7. 【BZOJ2959】长跑(Link-Cut Tree,并查集)

    [BZOJ2959]长跑(Link-Cut Tree,并查集) 题面 BZOJ 题解 如果保证不出现环的话 妥妥的\(LCT\)傻逼题 现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一 ...

  8. 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)

    [BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...

  9. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)

    [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...

  10. 【BZOJ2588】Count On a Tree(主席树)

    [BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...

随机推荐

  1. JS模块化工具requirejs教程(二):基本知识

    基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...

  2. php敏感词过滤

    在项目开发中发现有个同事在做敏感词过滤的时候用循环在判断,其实是不用这样做的,用php的数组函数和字符串函数即可实现 function filterNGWords($string) { $badwor ...

  3. php 数组排序代码

    php对数组排序代码.   <?phpclass='pingjiaF' frameborder='0' src='http://www.jbxue.com' scrolling='no'> ...

  4. MySQL下查看用户和建立用户

    启动数据库: [root@server ~]# mysqld_safe & [1] 3289 [root@server ~]# 130913 08:19:58 mysqld_safe Logg ...

  5. 19) Java并发

    >synchronized synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块.  1>synchronized 方法:通过在 ...

  6. 第十六章 调试及安全性(In .net4.5) 之 调试程序

    1. 概述 本章内容包括 如何选择合适的构建类型.创建和管理编译指令.管理程序数据文件(pdb)和指令. 2. 主要内容 2.1 构建类型 .net中默认的两种生成模式是 发布(Release)模式 ...

  7. WPF Event 在 Command 中的应用初级篇,支持所有Event 展示松耦合设计的全部代码 - 解决TextBoxBase.TextChanged或者TextBox.TextChanged等类似事件绑定问题。

    做过WPF开发的人,都知道做MVVM架构,最麻烦的是Event的绑定,因为Event是不能被绑定的,同时现有的条件下,命令是无法替代Event.而在开发过程中无法避免Event事件,这样MVVM的架构 ...

  8. EOF 与 getchar()

    1.EOF EOF是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin) ...

  9. NOJ1103-全排列

    全排列 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 1148            测试通过 : 302  ...

  10. EMVTag系列2《磁条等效数据》

    Ø 57  磁条2等效数据 L: var. up to 19 -M(必备):此数据必须存在并提供给终端,终端在读应用数据过程中,如果没有读到必备数据,终端中止交易 按GB/T 17552,磁条2的数据 ...