HNU算法设计与分析小班之石子合并相关问题

这次小班课我主要讲的是动态规划相关的问题,其中我找了四个题目,它们之间的关系相当密切,代码模板基本一致,因此联系在一起讲。

为了表达方便,这里第i堆石子对应的下标就是i而非i-1

而对于不相邻的石堆ij,如果要从石堆i一直合并到石堆j,那么合并成最终的一堆之前必然是相邻两个石堆合并,即有一个石堆ki≤kj),它将石堆(i…j)划分成了石堆(i…k)和石堆(k+1…j)。由最优子结构性质,从石堆i一直合并到石堆j的最小得分也就是合并成石堆(i…k)的最小得分,加上合并成石堆(k+1…j)的最小得分,再加上石堆(i…k)与石堆(k+1…j)合并成石堆(i…j)的得分,所得结果中的最小值即为我们想要的答案。用公式来表示,即:dp[i][j]=min(dp[i][k]+ dp[k+1][j])+两石堆的石子数之和,其中i≤kj

设石堆的石子数为stones[],因此上面的公式可以进一步写为如下的式子:dp[i][j]=min(dp[i][k]+ dp[k+1][j])+(stones[i]+…+stones[k]+stones[k+1]+…stones[j]), 其中i≤kj

首先,对于最大得分,我们可以用非常相似的步骤解决,唯一需要修改的地方就是初始化和动态规划方程。

从之前的分析我们现在可以很快得到,从石堆i一直合并到石堆j的最大得分等于合并成石堆(i…k)的最大得分,加上合并成石堆(k+1…j)的最大得分,再加上石堆(i…k)与石堆(k+1…j)合并成石堆(i…j)的得分,所得结果中的最大值即为我们想要的答案。

因为获取最小得分和最大得分所需要的dp数组不同,为了加以区分,我们设记录合并最小得分的数组为dpMin,记录合并最大得分的数组为dpMin

目前,我们已经获得了“n堆石子排成一排时,如何得到合并成一堆的最小得分和最大得分”这一问题的解决思路。然而,题中的n堆石子是绕着一个圆形操场排成一圈的,这又该如何解决呢?

我们以这个输入为例来进行具体分析。

4堆石子排成一排和排成一圈,分别如图所示。

排成一圈时,石堆1~4不仅只有1234的顺序还有234134124123的顺序,原来的一排数组变成了一个循环数组。

事实上,我们可以把循环数组简化为一个非循环数组,即把排成一圈转化为排成一排,只要在1234后面再加上123,如图所示

以看出,这样转化以后,我们只要选连续的n(这里是4)堆石子,即可得到1234234134124123这些顺序,与排成一圈完全一致。

到这里,排成一圈这个问题就变得很简单了,只需要先复制元素获得非循环数组,将排成一圈转化为排成一排,再根据排成一排的思路对问题进行解答即可。

复制之后获得的非循环数组有多大呢?假设有n堆石子,实际上只要复制前n-1堆即可得到所有的顺序。如上图,共4堆石子,复制第123堆即可得到非循环数组1234123,其中包含排成一圈时所有的石堆顺序。因此非循环数组的大小为2n-1

那么,最终我们的最小得分和最大得分如何得到呢?我们继续以上图为例解释:选连续的n(这里是4)堆石子,可以得到1234234134124123这些顺序,这4个顺序对应着4种不同的总合并方法。

①即以第1堆石子为头,第4堆石子为尾的合并方法;②即以第2堆石子为头,第1堆石子为尾的合并方法;③即以第3堆石子为头,第2堆石子为尾的合并方法;④即以第4堆石子为头,第3堆石子为尾的合并方法。通过循环遍历这4种总合并方法对应的dp数组的值,即可得到4种方法各自的最小得分和最大得分,再取四种方法最小得分的最小值以及最大得分的最大值,即可得到最终答案。

设计算A[i:j]1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值