一类动态规划的四边形优化

本文探讨了一类动态规划问题,涉及将石子按特定费用标准划分成多堆。通过排序和四边形不等式,提出了一种优化算法,将时间复杂度从O(m*n^2)降低到O(m*n*log(n))。

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

前段时间看到csdn论坛的数据结构与算法版上有人问了这么一个问题:
给定n个石子,其重量为a1,a2...,an,要求将其划分为m堆,每一份划分的费用定义为这堆石头中最大重量与最小重量的差的平方。总划分费用等于各堆费用之和。 输入:n m 及a1,a2...,an ,输出:sum

我搜了一下,发现同样的问题问过不止一遍:
http://topic.youkuaiyun.com/u/20091216/00/34ca0d8d-9d56-4ed4-821b-5171e1a67679.html?50332
http://topic.youkuaiyun.com/u/20091212/01/bcd82df3-ef2a-4ccd-bd1f-af8588e8e114.html

这道题显然用DP可以解决:
对所有石子的重量从小到大进行排序,设排序后的重量为a[1], a[2]....a[n]。

设f[n,m]为n个石子分成m堆后的最小费用,我们可以列出DP转移方程:
f[j,m] = min_i{f[i,m-1] + (a[j]-a[i])^2}  (i<j)
这样我们得到了一个O(m*n^2)的算法。(这里小小的解释一下为什么要排序:因为每个堆的费用只记录最大值和最小值的平方,中间的值完全没有用处,所以应该把所有中间的值都放到这个堆中,使它们不会增大其他堆的费用。当排完序后,每一堆就是序列中的某一段。)

然而,这样的复杂度并不是很好,考虑到m最大可到n,当n大到1000级别的时候,程序运行将会是很慢,我们需要优化它。事实上,这道题中每一堆的费用是满足一些特殊性的。

设从i到j的石子的费用为w[i,j]=(a[j]-a[i])^2。对于这个w[i,j],可以验证,当i<=i'<=j<=j'时,有w[i,j']+w[i',j]>=w[i,j]+w[i',j']。这就是四边形不等式。有了这个性质,我们该如何用它来对DP进行优化呢?


我们看到每个f[i,m]的计算是根据f[x,m-1]的值进行运算的,我们可以把转移方程看成对下面这个方程进行了m次操作:E[j]=min_i{D[i]+w[i,j]} (i&l

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值