动态规划之四边形不等式优化

四边形不等式

设函数\(w(x,y)\)是定义在\(Z\)上的函数,若对于任意\(a,b,c,d \in Z\),其中\(a\leq b \leq c \leq d\), 都有\(w(a,d)+w(b,c)\ge w(a,c)+w(b,d)\),则称函数\(w\)满足四边形不等式

推论:

设函数\(w(x,y)\)是定义在\(Z\)上的函数,若对于任意\(a,b \in Z\),其中\(a<b\), 都有\(w(a,b+1)+w(a+1,b) \ge w(a,b)+w(a+1,b+1)\),则函数\(w\)满足四边形不等式

证明:

对于\(a<c\),有:
\[
w(a,c+1)+w(a+1,c) \ge w(a,c)+w(a+1,c+1)
\]
对于\(a+1<c\),有:
\[
w(a+1,c+1)+w(a+2,c) \ge w(a+1,c)+w(a+2,c+1)
\]
两式相加,得:
\[
w(a,c+1)+w(a+1,c)+w(a+1,c+1)+w(a+2,c)\ge w(a,c)+w(a+1,c+1)\+w(a+1,c)+w(a+2,c+1)
\]
整理得:
\[
w(a,c+1)+w(a+2,c)\ge w(a,c)+w(a+2,c+1)
\]
依此类推,对于任意\(a\leq b \leq c\),有:
\[
w(a,c+1)+w(b,c)\ge w(a,c)+w(b,c+1)
\]
(此处即用\(b\)来代替\(a+2\),因为\(a+1 <c\) ,所以\(b \leq c\))

同理,对于任意\(a\leq b \leq c \leq d\),有:
\[
w(a,d)+w(b,c)\ge w(a,c)+w(b,d)
\]

定理1

对于任意\(a,b,c,d \in Z\),如果函数\(w\)满足四边形不等式,且\(w(a,d)\ge w(b,c)\),则函数\(f\)也满足四边形不等式,其中\(f\)满足:
\[
f(x,y)=min(f(x,z)+f(z+1,y)+w(x,y)|x\leq z <y)
\]
(特别的,我们令\(f(x,y)=w(x,y)=0\))

证明:

当\(x+1=y\)时,我们有:
\[
f(x,y+1)+f(x+1,y)=f(x,x+2)+f(x+1,x+1)=f(x,x+2)
\]
若\(f(x,x+2)\)的最优决策是\(x+1\),则:
\[
f(x,x+2)=f(x,x+1)+f(x+2,x+2)+w(x,x+2)=w(x,x+1)+w(x,x+2)
\]
显然
\[
w(x,x+1)+w(x,x+2)\ge w(x,x+1)+w(x+1,x+2)
\]
若\(f(x,x+2)\)的最优决策是\(x\),则:
\[
f(x,x+2)=f(x,x)+f(x+1,x+2)+w(x,x+2)=w(x+1,x+2)+w(x,x+2)
\]
显然
\[
w(x+1,x+2)+w(x,x+2)\ge w(x+1,x+2)+w(x,x+1)
\]

\[
w(x,x+1)+w(x+1,x+2)=f(x,x+1)+f(x+1,x+2)=f(x,y)+f(x+1,y+1)
\]
所以当\(x+1=y\) 时,我们得到:
\[
f(x,y+1)+f(x+1,y)\ge f(x,y)+f(x+1,y+1)
\]
即此时四边形不等式成立。

接下来,我们运用数学归纳法

假设当\(y-x<k\)时,四边形不等式成立。

我们现在考虑\(y-x=k\)的情况

令\(f(x,y+1)\)以\(a\)为最优决策,\(f(x+1,y)\)以\(b\)为最优决策。

不妨设\(x+1\leq a \leq b\)

易得:
\[
f(x,y+1)+f(x+1,y)=f(x,a)+f(a+1,y+1)+w(x,y+1)\+f(x+1,b)+f(b+1,y)+w(x+1,y)
\]
对于\(f(x,y)\)和\(f(x+1,y+1)\),由于\(a\),\(b\)不一定是最优决策,所以我们有:
\[
f(x,y)+f(x+1,y+1)\le f(x,a)+f(a+1,y)+w(x,y)\+f(x+1,b)+f(b+1,y+1)+w(x+1,y+1)
\]
因为\(w\)满足四边形不等式,所以:
\[
w(x,y+1)+w(x+1,y)\ge w(x,y)+w(x+1,y+1)
\]
根据归纳假设,我们有:
\[
f(a+1,y+1)+f(b+1,y)\ge f(a+1,y)+f(b+1,y+1)
\]
于是我们有:
\[
f(x,y+1)+f(x+1,y)\ge f(x,y)+(x+1,y+1)
\]

定理2:

对于任意\(a,b,c,d \in Z\),如果函数\(w\)满足四边形不等式,且函数\(f\)满足:
\[
f(x,y)=min(f(x,z)+f(z+1,y)+w(x,y)|x\leq z <y)
\]
(特别的,我们令\(f(x,y)=w(x,y)=0\))

记\(P(x,y)\)为令\(f(x,y)\)取到最小值的\(k\)值。如果函数\(f\)满足四边形不等式,那么对于任意\(x\),\(y\),我们有:
\[
P(x,y-1)\leq P(x,y)\leq P(x+1,y)
\]
证明:

记\(p=P(i,j)\)。

对于任意的\(x< k \leq p\),由四边形不等式得:
\[
f(x,t)+f(x+1,k)\ge f(x,k)+f(x+1,t)
\]
移项得:
\[
f(x+1,k)-f(x+1,t)\ge f(x,k)-f(x,t)
\]
由于\(p\)为最优决策,所以我们有:
\[
f(x,k)+f(k+1,y)\ge f(x,p)+f(p+1,y)
\]
所以:
\[
\begin{array}{lcr}
(f(x+1,k)+f(k+1,y)+w(x+1,y))-(f(x+1,p)+f(p+1,y)+w(x+1,y))\=(f(x+1,k)-f(x+1,p))+(f(k+1,y)-f(p+1,y)) \\ge (f(x,k)-f(x,p))+(f(k+1,y)-f(p+1,y)) \=(f(x,k)+f(k+1,y))-(f(x,p)+f(p+1,y))\\ge 0
\end{array}
\]
这意味着,对于\(f(x+1,y)\) 的任意决策\(k\leq p\),\(p\)都要比\(k\)更优(包括相等)

所以
\[
P(x+1,y)\ge P(x,y)
\]
同理可证
\[
P(x,y-1)\leq P(x,y)
\]
所以
\[
P(x,y-1)\leq P(x,y) \leq P(x+1,y))
\]

例题

1.[NOI1995]石子合并

现在有\(n\)堆石子(环状), 每次只能将相邻的两堆合并成一堆,每次的得分是两队石子之和,求最大得分和最小得分

显然,本题是区间dp。

令\(dp[i][j]\)表示\(i\)到\(j\)之间合并石子的最小值(最大值同理),则我们可以很轻松地列出状态转移方程为:
\[
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+d(i,j)|i\leq k < j)
\]
其中\(d(i,j)\)表示\(i\)到\(j\)之间石子的个数

当问题是最小值时,我们就可以用四边形不等式优化了。此时,对于\(dp[i][j]\),我们只需要在区间\([P[x][y-1],P[x+1][y]]\)枚举\(k\)即可,时间复杂度为\(O(n^2)\)

(注意:最大值并不满足单调性,不能用四边形不等式优化)

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int dp2[maxn][maxn];
int n;
int a[maxn];
int sum[maxn];
int p[maxn][maxn];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i];
    for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i],p[i][i]=i;
    for(int i=n<<1;i>=1;i--)
        for(int j=i+1;j<=n<<1;j++){
            dp[i][j]=0x3f3f3f3f;
            for(int k=p[i][j-1];k<=p[i+1][j];k++){
                if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j]){
                    dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
                    p[i][j]=k;
                }else if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]==dp[i][j])
                    p[i][j]=max(p[i][j],k);
            }
        }
    for(int len=2;len<=n;len++){
        for(int i=1;i<=n*2;i++){
            int j=i+len-1;
            if(j>2*n) break;
            for(int k=i;k<j;k++){
                dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
            }
        }
    }
    int ans=0x3f3f3f3f;
    int ans2=0;
    for(int i=1;i<=n;i++) ans=min(ans,dp[i][i+n-1]);
    for(int i=1;i<=n;i++) ans2=max(ans2,dp2[i][i+n-1]);
    printf("%d\n%d\n",ans,ans2);
    return 0;
}

原文地址:https://www.cnblogs.com/ybwowen/p/11116654.html

时间: 2024-12-16 03:17:48

动态规划之四边形不等式优化的相关文章

动态规划专题小结:四边形不等式优化

今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂.因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可. 四边形不等式优化条件 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通

四边形不等式优化

四边形不等式优化条件(转自这里) 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通过四边形不等式来优化上述方程,首先介绍什么是"区间包含的单调性"和"四边形不等式" (1)区间包含的单调性:如果对于i≤i'<j≤

四边形不等式优化DP——石子合并问题 学习笔记

好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 求出将n堆石子合并成一堆的最小得分和最大得分以及相应的合并方案. 设m[i,j]表示合并d[i..j]所得到的最小得分. 状态转移方程: 总的时间复杂度为O(n3). [优化方案] 四边形不等式: m[i,j]满足四边形不等式 令s[i,j]=max{k | m[

石子合并(四边形不等式优化dp)

该来的总是要来的———————— 经典问题,石子合并. 对于 f[i][j]= min{f[i][k]+f[k+1][j]+w[i][j]} From 黑书 凸四边形不等式:w[a][c]+w[b][d]<=w[b][c]+w[a][d](a<b<c<d) 区间包含关系单调: w[b][c]<=w[a][d](a<b<c<d) 定理1:  如果w同时满足四边形不等式和决策单调性 ,则f也满足四边形不等式 定理2:  若f满足四边形不等式,则决策s满足 s[i

pku 1160 Post Office 四边形不等式优化 经典DP

pku 1160 Post Office 四边形不等式优化 经典DP 邮局 经典的动态规划问题,主要体现在状态的设计和可以用四边形不等式优化上 题意是:给你n个村庄,然后让你用m个邮局对这些村庄进行覆盖,然后让你设计覆盖方式使得每个村庄到其对应邮局的路程和最短 本题状态的设计的灵感来源于"覆盖"这个点,最优子结构其实就是用 m 个邮局覆盖,以及用 m-1个邮局覆盖 那么,状态为dp[n][m] 为前 n 个村庄用 m 个邮局进行覆盖使得每个村庄到其对应的邮局的最短路程和 转移方程:dp

BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<

四边形不等式优化石子合并Codevs3002题解

题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n≤3000) 第二行n个整数w1,w2...wn(wi≤3000) 输出描述 Output Description 一个整数表示最小合并代价 样例输入 Sample Input 4 4 1 1 4 样例输出 S

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

题目描述 有一排石子,共n 堆.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分. 题解 首先由直接动态规划的方法来做,即 for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) for(int k=i;k<=j;k++) { f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+cost[j]-cost[i-1]);

HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程很容易想出来,dp[i][j] 表示前 j 个数分成 i 组.但是复杂度是三次方的,肯定会超时,就要对其进行优化. 有两种方式,一种是斜率对其进行优化,是一个很简单的斜率优化 dp[i][j] = min{dp[i-1][k] - w[k] + sum[k]*sum[k] - sum[k]*sum[