dp优化-四边形不等式(模板题:合并石子)

本文详细解析了动态规划中四边形不等式的应用,通过合并石子问题,展示了如何从O(n^3)优化至O(n^2)的复杂度。深入探讨了决策单调性、凸性证明及模板实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dp优化-四边形不等式(模板题:合并石子)

学习博客:https://blog.youkuaiyun.com/noiau/article/details/72514812

 

看了好久,这里整理一下证明

方程形式:dp(i,j)=min(dp(i,k)+dp(k+1,j))+cost(i,j)  O(n^3)

四边形不等式:将其优化为O(n^2)

 

1.四边形不等式

a<b<=c<d

f(a,c)+f(b,d)<=f(b,c)+f(a,d)交叉小于包含

 

则对于i<i+1<=j<j+1

f(i,j)+f(i+1,j+1)<=f(i+1,j)+f(i,j+1)

f(i,j)-f(i+1,j)<=f(i,j+1)-f(i+1,j+1)

令g(j)=f(i,j)-f(i+1,j),则g(j)递增

 

2.若cost(i,j)有凸性,则dp(i,j)也有凸性

只需要证明对任意i<i+1<=j<j+1,有dp(i,j)+dp(i+1,j)<=dp(i+1,j)+dp(i,j+1)

设dp(i+1,j)取最优解的k=x,dp(i,j+1)取最优解的k=y

即要证:dp(i,j)+dp(i+1,j)<=dp(i,y)+dp(y+1,j+1)+dp(i+1,x)+dp(x+1,j)+cost(i,j+1)+cost(i+1,j)(1)

令A=dp(i,y)+dp(y+1,j+1)+dp(i+1,x)+dp(x+1,j);

由于dp(i,j)的最优解不一定为k=x,则dp(i,j)<=dp(i,x)+dp(x+1,y)+cost(i,j)

同理由于dp(i+1,j)的最优解不一定为k=y,则dp(i+1,j)<=dp(i+1,y)+dp(y+1,j)+cost(i+1,j)

(1)式可化为:

dp(i,j)+dp(i+1,j)<=A+cost(i,j)+cost(i+1,j)<=A+cost(i,j+1)+cost(i+1,j)

由cost的凸性可知成立,故dp(i,j)也有凸性

 

3.证明决策的单调性

设s(i,j)表示dp(i,j)最优时的k值

要证:s(i,j-1)<=s(i,j)<=s(i+1,j)

先证s(i,j-1)<=s(i,j):

设y=s(i,j-1),对任意x满足x<=y<j-1<j,有x+1<=y+1<=j-1<j

由四边形不等式:dp(x+1,j-1)+dp(y+1,j)<=dp(x+1,j)+dp(y+1,j-1)

令A=dp(i,x)+cost(i,j-1)+dp(i,y)+cost(i,j)

两边同时加上A

化简得到:dp(i,j-1)(k=x时的值)+dp(i,j)(k=y)<=dp(i,j)(k=x)+dp(i,j-1)(k=y)

移项:dp(i,j-1)(k=x)-dp(i,j-1)(k=y)<=dp(i,j)(k=x)-dp(i,j)(k=y)

由于k=y时dp(i,j-1)取最小值,则左边>=0,即dp(i,j)(k=x)>=dp(i,j)(k=y)

也就是说,对于dp(i,j),任意一个k=x<y都不如k=y优。

故s(i,j-1)<=s(i,j)

另一边同理(不证了)

 

那么关键就在于枚举k的部分

 1 //s(i,j-1)<=s(i,j)<=s(i+1,j)
 2     for(int i=n;i>=1;i--)
 3         (int j=i+1;j<=n;j++)
 4         {
 5             int d=INF,id=0;
 6             for(int k=s[i][j-1];k<=s[i+1][j];k++)
 7             {
 8                 if(d>dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])
 9                 {
10                     d=dp[i][k]+dp[k][j]+sum[j]-sum[i-1];
11                     id=k;
12                 }
13             }
14             dp[i][j]=d;
15             s[i][j]=id;
16         }

 

总复杂度O(n^2)

补充一个证明

来源为https://www.cnblogs.com/mlystdcall/p/6525962.html,我稍微加了一点点

对于固定的区间长度len,有

  dp[i][i+len]的决策范围为s[i][i+len-1]至s[i+1][i+len]

  dp[i+1][i+len+1]的决策范围为s[i+1][i+len]至s[i+2][i+len+1]

  dp[i+2][i+len+2]的决策范围为s[i+2][i+len+1]至s[i+3][i+len+2]

  如此脑补下去,我们发现,对于固定的区间长度len,总共的决策只有O(n)个!因为一共有O(n)个不同的区间长度len,所以算法的总复杂度就是O(n^2)!

 

模板题:合并石子

 

现在有n堆石子,要将石子按一定顺序地合成一堆,规定如下,每次只能移动相邻的两堆石子,合并费用为新和成一堆石子的数量,求把n堆石子全部合并到一起所花的最少或者最大花费

 

很容易想到这样一个dp转移 
dp[i][j]=min{dp[i][k]+dp[k+1][j]}+cost[i][j] 
震惊!这不就是之前所讲的模型嘛?原来之前O(n^3)方的合并石子问题还可以优化(我太弱了) 
首先明确一点,cost[i][j]表示把第i堆到第j堆的石子和到一起的最后一步的代价,显然,之前无论怎么合并,最后一步的代价都是一样的,所以我们可以先预处理出这个cost数组,他等于cnt[j]-cnt[i-1],其中cnt数组是前缀和 
--------------------- 
作者:NOIAu 
来源:优快云 
原文:https://blog.youkuaiyun.com/noiau/article/details/72514812 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

分析题目:

只要证明cost(i,j)满足凸性。g(j)=cost(i,j)-cost(i+1,j)=sum(j)-sum(i-1)-sum(j)+sum(i)=sum(i)-sum(i-1)与j无关,满足(此时为等于)。

我的模板:

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N=10010,INF=(int)1e9;
 5 int dp[N][N],s[N][N],sum[N];
 6 
 7 int main()
 8 {
 9     //freopen("a.in","r",stdin);
10     int n;
11     scanf("%d",&n);
12     sum[0]=0;
13     for(int i=1;i<=n;i++)
14     {
15         int x;
16         scanf("%d",&x);
17         sum[i]=sum[i-1]+x;
18     }
19     for(int i=1;i<=n;i++) dp[i][i]=0,s[i][i]=i;
20     //s(i,j-1)<=s(i,j)<=s(i+1,j)
21     for(int i=n;i>=1;i--)
22         (int j=i+1;j<=n;j++)
23         {
24             int d=INF,id=0;
25             for(int k=s[i][j-1];k<=s[i+1][j];k++)
26             {
27                 if(d>dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])
28                 {
29                     d=dp[i][k]+dp[k][j]+sum[j]-sum[i-1];
30                     id=k;
31                 }
32             }
33             dp[i][j]=d;
34             s[i][j]=id;
35         }
36     printf("%d\n",dp[1][n]);
37     return 0;
38 }

 

posted @ 2018-10-31 17:39 拦路雨偏似雪花 阅读( ...) 评论( ...) 编辑 收藏
<think>好吧,用户说我在尝试用四边形不等式解决问题,但好像不太顺利。首先,我需要确认自己是否真的了解四边形不等式四边形不等式通常用于优化动态规划问题,尤其是在分划类的问题中,比如最优二叉搜索树或者矩阵链乘法的优化。 用户提到“四边形不等式”,可能是在尝试应用这个方法来降低时间复杂度。比如,当动态规划的状态转移方程满足某些条件时,四边形不等式可以帮助将时间复杂度从O(n^3)降到O(n^2)。这可能涉及到证明代价函数满足四边形不等式,从而利用其单调性或凸性来优化决策点的选择。 不过,用户可能遇到了问题,比如不知道如何正确应用四边形不等式,或者在证明过程中遇到了困难。需要具体分析用户的问题场景,比如他们是在处理哪种类型的动态规划问题,是否已经正确形式化了状态转移方程,以及是否验证了四边形不等式的条件。 可能需要引导用户检查几个关键点:首先,确认他们的代价函数是否满足四边形不等式,即对于任意的a ≤ b ≤ c ≤ d,是否有w(a,c) + w(b,d) ≤ w(a,d) + w(b,c)。其次,检查决策点的单调性,即决策点的位置是否随着状态的变化而单调移动。如果这些条件满足,那么四边形不等式优化可能适用。 另外,用户可能对四边形不等式的具体应用步骤不熟悉,比如如何将四边形不等式结合到动态规划中,或者如何调整现有的算法结构来利用这一优化。需要给出具体的例子,比如最优二叉搜索树或石子合并问题,说明如何应用四边形不等式优化决策过程。 还需要注意常见的误区,比如错误地应用四边形不等式到不满足条件的问题上,或者在证明过程中遗漏了某些必要条件。可能用户在此处出现了错误,导致优化无效或者结果不正确。 总结来说,用户需要更详细的步骤指导、具体的应用示例,以及如何验证四边形不等式的条件是否满足。可能需要分步骤解释四边形不等式的原理、适用场景、验证方法,以及如何在实际问题中应用,从而帮助用户正确使用这一优化技术。</think>好的,我将逐步为您解释四边形不等式(Quadrangle Inequality)及其在动态规划中的应用: 1. **基本定义** 四边形不等式指对于定义在整数域上的二元函数$w(i,j)$,若满足: $$ \forall a \leq b \leq c \leq d,\quad w(a,c) + w(b,d) \leq w(a,d) + w(b,c) $$ 则称$w$满足四边形不等式。当不等式方向相反时,称为反四边形不等式。 2. **几何意义** 该性质反映了函数值在区域划分上的优劣性比较,直观表现为:将两个相邻区间合并后的总成本,优于交叉划分的总成本。 3. **在DP优化中的应用** 典型应用于形如: $$ dp[i][j] = \min_{i \leq k < j} \{ dp[i][k] + dp[k+1][j] \} + w(i,j) $$ 的动态规划问题。当$w$满足四边形不等式时,最优决策点$k$具有单调性: $$ opt[i][j-1] \leq opt[i][j] \leq opt[i+1][j] $$ 4. **优化效果** 时间复杂度可从$O(n^3)$优化至$O(n^2)$,常见于以下经典问题: - 最优二叉搜索树 - 石子合并问题 - 邮局选址问题 - 矩阵链乘法优化 5. **验证步骤** (1) 证明$w(i,j)$满足四边形不等式 (2) 证明$dp[i][j]$满足决策单调性 (3) 使用交叉验证法:对任意$a < b < c < d$,验证: $$ w(a,c) + w(b,d) \leq w(a,d) + w(b,c) $$ 6. **实际应用示例(石子合并)** 原DP方程: $$ dp[i][j] = \min_{i \leq k < j} \{ dp[i][k] + dp[k+1][j] \} + \sum_{t=i}^j a_t $$ 当权函数$\sum$满足四边形不等式时,可限制决策点范围: ```python for l in range(2, n+1): # 区间长度 for i in range(1, n-l+2): j = i + l - 1 # 决策点仅在opt[i][j-1]到opt[i+1][j]之间 start = opt[i][j-1] if l > 2 else i end = opt[i+1][j] if l > 2 else j-1 for k in range(start, end+1): # 更新dp[i][j]和opt[i][j] ``` 7. **注意事项** - 需要严格验证四边形不等式条件 - 决策单调性可能仅在特定区间成立 -四边形不等式需要调整不等号方向 - 并非所有区间DP问题都适用 建议具体问题可提供状态转移方程,我们可以共同分析是否满足四边形不等式条件,并设计优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值