四边形不等式优化动态规划原理:

1.当决策代价函数w[i][j]满足w[i][j]+w[i’][j’]<=w[I;][j]+w[i][j’](i<=i’<=j<=j’)时,称w满足四边形不等式.当函数w[i][j]满足w[i’][j]<=w[i][j’] i<=i’<=j<=j’)时,称w关于区间包含关系单调.

2.如果状态转移方程m为且决策代价w满足四边形不等式的单调函数(可以推导出m亦为满足四边形不等式的单调函数),则可利用四边形不等式推出最优决策s的单调函数性,从而减少每个状态的状态数,将算法的时间复杂度由原来的O(n^3)降低为O(n^2).方法是通过记录子区间的最优决策来减少当前的决策量.令:

s[i][j]=max{k | ma[i][j] = m[i][k-1] + m[k][j] + w[i][j]}

由于决策s具有单调性,因此状态转移方程可修改为:

证明过程: (转载)

设m[i,j]表示动态规划的状态量。

m[i,j]有类似如下的状态转移方程:

m[i,j]=opt{m[i,k]+m[k,j]}(i≤k≤j)

如果对于任意的a≤b≤c≤d,有m[a,c]+m[b,d]≤m[a,d]+m[b,c],那么m[i,j]满足四边形不等式。

以上是适用这种优化方法的必要条件

对于一道具体的题目,我们首先要证明它满足这个条件,一般来说用数学归纳法证明,根据题目的不同而不同。

通常的动态规划的复杂度是O(n3),我们可以优化到O(n2)

s[i,j]m[i,j]的决策量,即m[i,j]=m[i,s[i,j]]+m[s[i,j]+j]

我们可以证明,s[i,j-1]≤s[i,j]≤s[i+1,j]  (证明过程见下)

那么改变状态转移方程为:

m[i,j]=opt{m[i,k]+m[k,j]}      (s[i,j-1]≤k≤s[i+1,j])

复杂度分析:不难看出,复杂度决定于s的值,以求m[i,i+L]为例,

(s[2,L+1]-s[1,L])+(s[3,L+2]-s[2,L+1])…+(s[n-L+1,n]-s[n-L,n-1])=s[n-L+1,n]-s[1,L]≤n

所以总复杂度是O(n2)

对s[i,j-1]≤s[i,j]≤s[i+1,j]的证明:

设mk[i,j]=m[i,k]+m[k,j],s[i,j]=d

对于任意k<d,有mk[i,j]≥md[i,j](这里以m[i,j]=min{m[i,k]+m[k,j]}为例,max的类似),接下来只要证明mk[i+1,j]≥md[i+1,j],那么只有当s[i+1,j]≥s[i,j]时才有可能有ms[i+1,j][i+1,j]≤md[i+1,j]

(mk[i+1,j]-md[i+1,j]) - (mk[i,j]-md[i,j])

=(mk[i+1,j]+md[i,j]) - (md[i+1,j]+mk[i,j])

=(m[i+1,k]+m[k,j]+m[i,d]+m[d,j]) - (m[i+1,d]+m[d,j]+m[i,k]+m[k,j])

=(m[i+1,k]+m[i,d]) - (m[i+1,d]+m[i,k])

∵m满足四边形不等式,∴对于i<i+1≤k<d有m[i+1,k]+m[i,d]≥m[i+1,d]+m[i,k]

∴(mk[i+1,j]-md[i+1,j])≥(mk[i,j]-md[i,j])≥0

∴s[i,j]≤s[i+1,j],同理可证s[i,j-1]≤s[i,j]

证毕

扩展:

以上所给出的状态转移方程只是一种比较一般的,其实,很多状态转移方程都满足四边形不等式优化的条件。

解决这类问题的大概步骤是:

0.证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件

1.证明m满足四边形不等式

2.证明s[i,j-1]≤s[i,j]≤s[i+1,j]

pku 1160 Post Office 解题报告

题意: 给出m个村庄及其距离,给出n个邮局,要求怎么建n个邮局使代价最小.

算法:很显然用到动态规划,那么假设:

d[i…n],各邮局的坐标

w[i][j]表示在d[i][j]之间建立一个邮局的村庄为k,则k为i与j之和的一半(很显然在中间建一个邮局距离最小),那么

m[i][j]为在前j个村庄建立i个邮局的最小距离和.

那么状态转移方程为:

边界条件: m[1][j]=w[1][j]  (1<=j<=m)

状态转移方程: 

那么思路则为:

for i=2 to p do      //递推邮局数

{

//m:在前j个村庄建立i个邮局的最小距离和

for j=n dwonto i+1 do    //按递减顺序枚举尾指针

m[i][j]=inf;

for k=1 to n do

{

temp = m[i-1][k]+calcw(k+1,j);

if(temp<m[i][j]) m[i][j]=temp;

}

}

这样时间复杂度显然为O(n^3),这是不能接受的.

仔细分析这dp算法,关键是决策变量k枚举数太多, 联系到四边形不等式原理,w[i][j]与m[i][j]很明显符合四边形不等式,我们假设决策变量s[i][j],如果在1到10的村庄中,建立1个邮局的最佳位置为8,那么在决定见多一个邮局的话,当然是在1到8之间了(根据四边形不等式原理猜想到),所以就在dp的过程中,用s[i][j]记录前i-1个邮局的村庄数. 那么我们第三次搜索的时候,就需要根据决策表s[i-1][j]<=k<=s[i][j+1]的范围内枚举.而可以证明s[i][j]具有单调性,那么我们就可以利用s[i][j]单调性限制了上下界然后把 O(n^3)弄成了 O(n^2)。

以sample为例:

状态方程m:

决策表s:

那么状态转移方程为:

边界条件: m[1][j]=w[1][j]  (1<=j<=m)

边界条件: m[1][j]=w[1][j]  (1<=j<=m)

状态转移方程: 

决策记录表: s[i][j]=k

代码:

View Code

//#pragma comment(linker,"/STACK:327680000,327680000")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))
#define REP(i, n)       for((i) = 0; (i) < (n); ++(i))
#define FOR(i, l, h)    for((i) = (l); (i) <= (h); ++(i))
#define FORD(i, h, l)   for((i) = (h); (i) >= (l); --(i))
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define Read()  freopen("data.in", "r", stdin)
#define Write() freopen("data.out", "w", stdout);typedef long long LL;
const double eps = 1e-8;
const double PI = acos(-1.0);
const int inf = ~0u>>2;using namespace std;const int N = 310;
const int M = 33;int dp[N][N];
int s[N][N];
int d[N];
int sum[N][N];int dis(int i, int j) {if(i >= j)  return 0;if(sum[i][j] != 0)  return sum[i][j];int a = i, b = j;while(a < b) {sum[i][j] += (d[b--] - d[a++]);}return sum[i][j];
}int main() {//Read();int i, j, k, V, P, tmp;while(~scanf("%d%d", &V, &P)) {for(i = 1; i <= V; ++i) {scanf("%d", d + i);}CL(sum, 0);CL(dp, 0);for(i = 1;  i <= V; ++i) {dp[1][i] = dis(1, i);s[i][i] = i-1;}for(i = 2; i <= P; ++i) {s[i][V+1] = V-1;for(j = V; j >= i; --j) {dp[i][j] = inf;for(k = s[i-1][j]; k <= s[i][j+1]; ++k) {tmp = dp[i-1][k] + dis(k + 1, j);if(tmp < dp[i][j]) {dp[i][j] = tmp;s[i][j] = k;}}}}printf("%d\n", dp[P][V]);}return 0;
}

转载于:https://www.cnblogs.com/vongang/archive/2013/01/21/2869315.html

[转]四边形不等式优化dp(POJ1160)相关推荐

  1. Post Office(邮局)之四边形不等式优化dp

    目录 前言 题目 解析 四边形不等式优化 何为四边形不等式 何为区间包含单调性 四边形不等式性质 DP 优化 参考代码(附注释) 前言 可以说这道题我可花费了很大功夫才理解的. 其中有些小技巧也是我钻 ...

  2. HDU-3480 Division (四边形不等式优化DP)

    题目大意:将n个数分成m组,将每组的最大值与最小值的平方差加起来,求最小和. 题目分析:先对数排序.定义状态dp(i,j)表示前 j 个数分成 i 组得到的最小和,则状态转移方程为dp(i,j)=mi ...

  3. 四边形不等式优化dp

    有关于四边形不等式的优化 https://blog.csdn.net/noiau/article/details/72514812 这篇博客有描述的足够清楚,我觉得自己肯定写不了这么好的博客所以放在这 ...

  4. 四边形不等式优化 --算法竞赛专题解析(10)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

  5. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  6. DP 最优二叉树 的四边形不等式优化

    最优比例二叉树.代价函数cost 满足 对任意 a <= b <= c <= d 有 cost[a,c] + cost[b,d] <= cost[a,d] + cost[b,c ...

  7. 【HDU 4905 多校联合】The Little Devil II【DP+四边形不等式优化】

    题意:给出一个数列,每次你可以选择相邻的两个数字进行求GCD,然后得到的数字把这两个数字替代,得到GCD的权值,求最后剩下一个数字后的最大的权值(权值初始是数列的和) 思路:定义dp[i][j]表示区 ...

  8. BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探

    貌似$BZOJ$上并没有这个题... 是嫌这个题水了么... 还是要氪金权限号??? 这里附上洛谷的题面:洛谷P4767 [IOI2000]邮局 题目描述 高速公路旁边有一些村庄.高速公路表示为整数轴 ...

  9. 四边形不等式优化-石子合并

    四边形不等式优化 四边形不等式定义 在oi历程中,常有如下的dp转移方程 \(f(i,j)=min(f(i,k)+f(k+1,j)+w(i,j))\) \((i<=k<j)\) \(f(i ...

最新文章

  1. linux目录都是什么意思,linux中的基本的目录结构都是什么意思,初学者都应该有印象-tmp是什么文件...
  2. 《JavaScript应用程序设计》一一3.2 流式JavaScript
  3. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
  4. 移动端怎么设计适合的表单?
  5. java面试总结之一
  6. plugin since you are using Gradle version 4.6 or above
  7. ASP.NET MVC程序播放H.264视频
  8. 如何解决aar中的第三方依赖无法调用问题
  9. ArcGIS:如何创建地理数据库、创建要素类数据集、导入要素类、表?
  10. java系统过载保护_浅谈过载保护
  11. 苹果怎么锁定计算机,苹果电脑如何锁定屏幕-mac锁定屏幕教程 - 河东软件园
  12. 浏览器显示域名解析错误怎么办
  13. 手机屏幕坏了,如何连接电脑取资料?按照这几种办法操作即可
  14. 如何安装UOS操作系统
  15. Web3游戏可以从夜店经济中学到什么?
  16. git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594
  17. 微软推出折叠双屏设备Surface Neo 双屏玩法多样
  18. 联想微型计算机c5606,中小企业入门级服务器首选联想万全R510
  19. 领导最爱的数据驾驶舱、大屏,真的只是“面子工程”吗?
  20. 全球及中国微电子封装材料行业发展前景展望及运营动态分析报告2021-2027年版

热门文章

  1. Apollo进阶课程⑳丨Apollo感知之旅——机器学习与感知的未来
  2. java 模块设计模式_Java9模块化学习笔记二之模块设计模式
  3. 玛纽尔扫地机器人怎样_扫地机器人哪个牌子好?满足日常清洁需求才值得推荐...
  4. git object 很大_这才是真正的Git——Git内部原理
  5. deepin部署python开发环境_deepin系统下部署Python3.5的开发及运行环境
  6. curl 请求日志_kong api网关日志 将请求和响应数据附加到磁盘上的日志文件中
  7. 《Python Cookbook 3rd》笔记(5.19):创建临时文件和文件夹
  8. 《Java8实战》笔记(06):用流收集数据
  9. memory_buffer详解
  10. 想对你说的话,就在这里!