hdu 3516 Tree Construction (四边形优化)

来源:互联网 发布:星际老男孩淘宝店2016 编辑:程序博客网 时间:2024/04/30 02:24

【题目大意】
二维平面上有n个,这些点满足
i < j时,xi < xj, yi > yj。
只用朝x轴或y轴正方向的边连起来,形成一棵树,使得所有边的长度最小。 n <= 1000
这里写图片描述

此类合并问题,如果满足四边形不等式,就可以通过四边形优化降次了。
定义状态 dp[i,j]表示点i到点j合并在一起的最小花费(树枝的长度),状态转移方程:dp[i,j]= min(dp[i,k]+dp[k+1,j]+cost(i,j) ) i < k < j, cost(i,j)=py[k]-py[j]+px[k+1]-px[i];
证明:
F(i)=cost(i,j+1)-cost(i,j)=py[j]-py[j+1]是一个与i无关的多项式,
所以j固定时,F(i)满足四边形不等式。
s[i,j]=k; s[i-1,j] <= s[i,j] <= s[i,j+1];
由于决策s具有单调性,因此状态转移方程可修改为:
dp[i,j]= min(dp[i,k]+dp[k+1,j]+cost(i,j) ) s[i-1,j] <=k<= s[i,j+1];
复杂度降到o(n^2)(原来从i…j-1枚举k, 优化后只需要从s[i,j-1]到s[i+1,j]枚举k就可以了。其中s[i,j]指dp[i,j]取最优解的分割点,这样复杂度就变成O(n2)啦!

dp[i][j]=MIN(dp[i][k]+dp[k+1][j]+x[k+1]-x[i]+y[k]-y[j] i<=k<=j

#include <iostream>#include <cstdio>  #include <algorithm>#include <cmath>#include <cstring> #define LL long long #define inf 0x3f3f3f3f using namespace std; const int N = 1005;int dp[N][N], s[N][N];  struct Node{      int x, y;  }a[N];  int dis(int i, int j){      return abs(a[i].y - a[j].y) + abs(a[i].x - a[j].x);  }  int main(){      int n, m, T;      while(scanf("%d",&n)!=EOF){        for(int i=1; i<=n; i++)              scanf("%d%d", &a[i].x, &a[i].y);            memset(dp, 0, sizeof(dp));          for(int i=1; i<=n; i++)  {            dp[i][i+1] = dis(i,i+1);              s[i][i+1] = i;          }          for(int L=2; L<n; L++)  {            for(int i=1; i+L<=n; i++)  {                int j = i + L;                dp[i][j] = inf;                for(int k=s[i][j-1]; k<=s[i+1][j]; k++)                      if(dp[i][j] > dp[i][k]+dp[k+1][j]+dis(i,j)-(a[i].y-a[k].y)-(a[j].x-a[k+1].x)){                        dp[i][j] = dp[i][k]+dp[k+1][j]+dis(i,j)-(a[i].y-a[k].y)-(a[j].x-a[k+1].x);                          s[i][j] = k;                      }            }        }        printf("%d\n",dp[1][n]);    }    return 0;  } 

补充四边形优化知识,
区间包含的单调性:
如果对于 i ≤ i’< j ≤ j’,有 w(i’,j) ≤ w(i,j’),那么说明w具有区间包含的单调性。
可以形象理解为如果小区间包含于大区间中,那么小区间的w值不超过大区间的w值。
四边形不等式:
如果对于 i ≤ i’< j ≤ j’,有 w(i,j)+w(i’,j’)≤w(i’,j)+w(i,j’),我们称函数w满足四边形不等式。
可以形象理解为两个交错区间的w的和不超过小区间与大区间的w的和。
下面给出两个定理:
1、如果上述的 w 函数同时满足区间包含单调性和四边形不等式性质,那么函数dp也满足四边形不等式性质。
我们再定义 s(i,j) 表示 dp(i,j) 取得最优值时对应的下标(即 i≤k≤j 时,k 处的 dp 值最大,则 s(i,j)=k)。此时有如下定理
2、假如dp(i,j)满足四边形不等式,那么s(i,j)单调,即s(i,j)≤s(i,j+1)≤s(i+1,j+1)。
这两个定理证明在赵爽的《动态规划加速原理之四边形不等式》中给出了相关的证明。
有了上述的两个定理后,我们发现如果w函数满足区间包含单调性和四边形不等式性质,那么有 s(i,j-1)≤s(i,j)≤s(i+1,j) 。

以上资料摘自别处,笔者也在摸索中(会用不会证)【无奈。
这里有个推荐详解

原创粉丝点击