题目
输入凸 n 边形 p 1 ,p 2 ,··· ,p n , 其中顶点按凸多边形边界的逆时针序给出,多边形中不相邻顶点间的连线称为弦。试设计一个动态规划算法,用若干条弦将凸边形 p 1 ,p 2 ,··· ,p n 剖分成一些无公共区域的三角形,使
得所有三角形的周长之和最小。
优化子结构及子问题重叠性
设所有三角形周长之和最小的一个划分为MTD,划分的所有不相邻顶点连线为MTLi(i从1到n-2,因为n凸多边形划分一定产生n-2条连线)
这个问题是要求MTD,首先最简单的考虑是凸多边形中最短的不相邻顶点连线是否一定在这个MTD中,证来证去发现并不能证明这个观点是否正确。
然后就借助画图,考虑假设这个MTD已经知道,那么会说明什么,或者有什么结论,最好是与子问题相关的结论,因为动态规划的关键就是找到问题的优化子结构。
经过初步的画图观察可以发现,n边形划分不相交的三角形构成的周长MTC其实是由两部分组成:
MTC=凸多边形的周长+2*(MTL1+……+MTLn-2)
所以,我们需要做的只是找到n-2条和最小的不相邻顶点连线MTL。问题就转化为找到最小的MTL,相比于原始问题,问题变得有些清晰了。
现在要做的就是找到最小的MTL这个问题是否具有优化子结构?如果有,优化子结构是什么?如果能够根据子结构的解来构造最终问题的解?经过一番思考,终于还是一无所获。于是翻开骆老师的《算法设计与分析》,发现在构造优化子结构时,首先将最优的方案设出来,如在0-1背包问题上,先设如果<x1,x2,x3,……xn>是0-1背包问题的最优解,然后……。
那么能不能先假设凸多边形最优的不相邻顶点连线划分为<Pk1Pk2,Pk3Pk4……PiPj……PknPkm>,那么从最优划分中任取PiPj,如果能证明PiPj将凸多边形分成的两个小凸多边形的三角形划分也是各自的最优解,那么原问题的最优解可以通过求解各个子问题后,组合来得到,具体就是,对于n凸多边形T,用任意一条不相邻的顶点PiPj将其划分为两个小凸多边形T1,T2,那么T的最优解则是MIN(T1的划分连线长度+T2划分的连线长度+PiPj),只需把所有小于n的凸多边形的最小周长划分求出来,然后遍历所有的PiPj划分(遍历所有i,j |i-j|),即可得到T的最优解。
举个例子,如图1-1,如果<P1P4,P1P3>是五边形的最优划分,那么由划分产生的任意凸四边形一定是该凸四边形的最优划分,否则,如果四边形P1P2P3P4的最优划分不是p1p3而是p2p4,即长度p1p3>p2p4,那么<P1P4,P2P4>构成原问题的最优划分,与原问题的最优划分是<P1P4,P1P3>矛盾,因此p1p3是四边形P1P2P3P4的最优划分。或者说,对于凸n边形T最优划分<Pk1Pk2,Pk3Pk4……PiPj……PknPkm>,其中的一条划分PiPj将其划分成T1,T2两部分,如果T1或T2现在得划分不是最优划分,那么通过变换T1或T2的划分,能够得到更优的原问题T的解,但这个解与T的最优划分<Pk1Pk2,Pk3Pk4……PiPj……PknPkm>不符,矛盾,因此任意T的最优划分中的PiPj划分出的T1,T2一定是各自的最优解。
现在我们可以通过先求出所有n-1多边形的最优解来构造n边形的最优解。意思就是在凸n边形中,从下向上,求每个凸五边形的最优划分为四边形的划分加上第五条边,一定有一个最优的凸五边形划分,求每个凸六边形的最优划分为五边形的划分加上第五条边,一定有一个最优的凸六边形划分,……。求凸n边形的最优划分为n-1边形划分加上第n条边,一定有一个最优的凸n边形划分。
伪代码
注意:MTDik,其中i指i边形,k指凸n边形中共有k个i边形,PiPj是指i-1边形加上第i个划分PiPj,构成i边形的完整划分。
1. Ifn=3 Then
2. return 0;
3. Ifn=4 Then
4. 求出两条对角线中最小的那个,返回最小划分
5. If n>4Then
6. 求出所有4边形的最优划分,即最小划分长度MTD4k,
7. for i=5 To n-1 Do
8. for 凸n边形中所有i边形 Do
9. MTDik= MTDi-1k + PiPj
10. for 凸n边形中所有n-1边形 Do
11. MTD=MTD>MTDn-1k +PiPj ? MTD: MTDn-1k +PiPj
12. returnMTD
总结
待。