四边形不等式dp优化
来源:互联网 发布:js获取点击按钮的id 编辑:程序博客网 时间:2024/04/28 05:02
转自大牛
四边形不等式优化动态规划原理:
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为 : m[i][j]=min {m[i][k-1]+m[k][j]+w[i][j]} , (i<k<=j),且决策代价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]=min {m[i][k-1]+m[k][j]+w[i][j]} , (s[i][j-1]<=k<=s[i+1][j])
证明过程: (转载)
设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]=min {m[i-1][k]+w[k+1][j]} , (i<=j , i-1<=k<=j-1)
m[i][j]为在前j个村庄建立i个邮局的最小距离和.
那么状态转移方程为:
边界条件: m[1][j]=w[1][j] (1<=j<=m)
状态转移方程: m[i][j]=min {m[i-1][k]+w[k+1][j]} , (i<=j , i-1<=k<=j-1)
那么思路则为:
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:
0 112359213743 2123592127 61235915 1012359 16 21 37 74 117
决策表s:
0 113333788 23355788 3355788 456789 5 6 7 8 9
那么状态转移方程为:
边界条件: m[1][j]=w[1][j] (1<=j<=m)
边界条件: m[1][j]=w[1][j] (1<=j<=m)
状态转移方程: m[i][j]= min {m[i-1][k]+w[k+1][j]} , (i<=j , s[i-1][j]<=k<=s[i][j+1])
决策记录表: s[i][j]=k
AC代码:
- 四边形不等式优化DP
- 四边形不等式优化dp
- 四边形不等式dp优化
- 四边形不等式优化dp
- 四边形不等式优化dp-简介
- hdu2829Lawrence DP+四边形不等式优化
- pku 1160 四边形不等式优化DP
- dp专辑 U - Lawrence [ 四边形不等式优化]
- ZOJ2860----DP+四边形不等式的优化
- HDU3480-----用四边形不等式优化的DP
- HDU 2829 Lawrence【dp四边形不等式优化】
- HDU 3480 Division【dp四边形不等式优化】
- hdoj 2829 Lawrence 四边形不等式优化dp
- 线性DP 四边形不等式优化 hdu3506
- Hdu3480 Division dp+四边形不等式优化
- hdu 3516 dp+四边形不等式优化
- UVA 10304 dp的四边形不等式优化
- hdu 3506 dp+四边形不等式优化
- tcp握手与挥手
- mysql的事务级别
- 学习陌生领域的速度,才是月薪3000和3万的真正区别
- Qt中mysql驱动
- Java学习第一天
- 四边形不等式dp优化
- MySQL小结
- leetcode[Power of Three]
- 进程间通信(三)--严格轮换法
- 用Swift3和SQLite3实现课程表
- 如何在O(1)时间删除链表指定节点(Java实现)
- web 学习笔记11-Cookie和Session技术
- Linux内核Makefile分析
- java虚拟机内存溢出学习总结