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函数的定义不同……

  1. //HDOJ 3516
  2. #include<cmath>
  3. #include<vector>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<iostream>
  8. #include<algorithm>
  9. #define rep(i,n) for(int i=0;i<n;++i)
  10. #define F(i,j,n) for(int i=j;i<=n;++i)
  11. #define D(i,j,n) for(int i=j;i>=n;--i)
  12. #define pb push_back
  13. #define CC(a,b) memset(a,b,sizeof(a))
  14. using namespace std;
  15. int getint(){
  16. int v=,sign=; char ch=getchar();
  17. while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
  18. while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
  19. return v*sign;
  20. }
  21. const int N=,INF=~0u>>;
  22. const double eps=1e-;
  23. /*******************template********************/
  24. //#define debug
  25. int x[N],y[N],dp[N][N],s[N][N];
  26. int main(){
  27. #ifndef ONLINE_JUDGE
  28. freopen("input.txt","r",stdin);
  29. // freopen("output.txt","w",stdout);
  30. #endif
  31. int n;
  32. while(scanf("%d",&n)!=EOF){
  33. F(i,,n) x[i]=getint(),y[i]=getint();
  34. F(i,,n){
  35. dp[i][]=;
  36. s[i][]=i;
  37. }
  38. F(i,,n-){
  39. dp[i][]=x[i+]-x[i]+y[i]-y[i+];
  40. s[i][]=i;
  41. }
  42. #ifdef debug
  43. F(i,,n-) printf("%d ",dp[i][]);
  44. printf("\n");
  45. #endif
  46. F(j,,n)
  47. F(i,,n-j+){
  48. dp[i][j]=INF;
  49. F(k,s[i][j-],s[i+][j-]){
  50. int tmp=y[k]-y[i+j-]+x[k+]-x[i]+dp[i][k-i+]+dp[k+][j-(k-i+)];
  51. #ifdef debug
  52. printf("i=%d k=%d j=%d\n",i,k,j);
  53. printf("dp[i][k-i+1]=%d dp[k+1][j-k]=%d\n",dp[i][k-i+],dp[k+][j-k]);
  54. #endif
  55. if (tmp<dp[i][j]){
  56. s[i][j]=k;
  57. dp[i][j]=tmp;
  58. }
  59. }
  60. }
  61. #ifdef debug
  62. F(j,,n){
  63. F(i,,n) printf("%d ",dp[i][j]);
  64. printf("\n");
  65. }
  66. F(j,,n){
  67. F(i,,n) printf("%d ",s[i][j]);
  68. printf("\n");
  69. }
  70. #endif
  71. printf("%d\n",dp[][n]);
  72. }
  73. return ;
  74. }

(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. C#中使用官方驱动操作MongoDB

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...

  2. [leetcode]_Unique Paths

    题目:有一个m * n 的方格,如下图,一个小robot希望从左上角走到右下角,共有多少种不同的路线走法. 思路: 我的错误思路:全排列,从(0,0)走到(m - 1,n - 1)共需要往下走m-1步 ...

  3. 使用maven, myeclipse工具构建spring mvc项目

    一.使用myeclipse 创建一个新的 maven项目. (ps:1.在filter过滤的时候输入 webapp 选择"maven-archetype-webapp". 2.在m ...

  4. 等价表达式 (codevs 1107)题解

    [问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些 ...

  5. android在程序中打开另一个程序

    在开发android应用的时候,在一些情况下要有前置条件,比如这边所说的要启动时要确保别的应用程序服务已经打开  或者在操作中启动别的应用等. 先来一段google上的代码: 1. 已知包名和类名的情 ...

  6. Oracle sql trace

    一.SQL_TRACE说明 1.1.在全局启用 在参数文件(pfile/spfile)中指定:sql_trace =true 1.2.在当前session级设置 启用当前session的跟踪: alt ...

  7. 刀哥多线程同步任务作用gcd-07-sync_task

    同步任务的作用 同步任务,可以让其他异步执行的任务,依赖某一个同步任务 例如:在用户登录之后,再异步下载文件! - (void)gcdDemo1 { dispatch_queue_t queue = ...

  8. [CentOS 6.5 X64]讓firefox java plugin 啟動

    到ORACLE下載JRE http://www.oracle.com/technetwork/java/javase/downloads/index.html 我是X64所以下載 jre-7-linu ...

  9. CentOS 6.3 安装以及配置Apache php mysql

    准备篇: 1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dp ...

  10. Matlab实现单(双)极性(不)归零码

    Matlab实现单(双)极性(不)归零码 内容大纲 Matlab实现单极性不归零波形(NRZ),0 1 幅值 Matlab实现单极性归零波形(RZ),0 1 幅值 Matlab实现双极性不归零波形,- ...