| 要求输入多边形的顶点数 n和它的顺时针坐标,返回最小区域数和具体的划分方法。 例 : 给定如左图所示的小岛, 可有右图所示的两种划分, (1)划分为3个区域,是最优的。(2)划分为4个区域。
图略
状态表示2-1 根据多边形的自然特征,一个多边形顶点的顺时针序列将正确的描述多边形的特征。例如在图(1)中,序列(1,2, …,N-1 ,N)可以表示多边形A,序列(1,2,…,K)可以表示多边形B,同样序列(K,K+1,…,N)可以表示多边形C。 由于在问题二中,多边形的顶点的序号已经隐含了顶点之间的顺序,我们只要记录多边形的顶点,而不必记录顶点顺序。基于这个性质,我们可以用一个十进制数来表示一种状态。一个十进制数通过它对应的二进制数来描述多边形。二进制数X第k位上的0、1值代表这个多边形是否包含第k个顶点。例如 (011011)2的1,2,4,5位上数值是1,则 这个二进制数代表多边形(1,2,4,5),用相应的十进制数表示就是27。 于是用一元组(A)描述多边形, D(A)表示多边形A的划分区域数。多边形B、C是由多边形划分A而成的两个多边形,那么,这种划分下,多边形的最优划分必然包含多边形B、C的最优划分,问题满足最优子结构性质。 那么状态转移方程可以表示为 D(A)= Min(D(B)+ D(C)) 子问题的空间复杂度为O(2n),当n=20,基本堆空间就溢出了(本文假设基本堆空间是219=524288 byte并且每个子问题的状态表示只要1 byte) ,动态规划只能处理顶点数小于20的多边形。 状态表示2-2 定义2-2 多边形(A1,A2,…,Ak)是由多边形(1,2,…,N)划分而来的多边形,我们称多边形(A1,A2,…,Ak)为半连续多边形,当且仅当Ai+1 = Ai+1 , k>i >1。图4中多边形(1,4,5,6,7)就是一个半连续多边形。 性质2-2 对于一个多边形,它的任一顶点a只有两种划分情况:一是顶点a的两个相邻顶点连接,一是顶点a与其他顶点连接,并且这两种划分必有其一。如图3,顶点1的划分情况:顶点1的相邻顶点(2,9)连接;顶点1与顶点4连接。
我们可以用一个三元组(X,Y,Z)描述半连续多边形,D(X,Y,Z)表示半连续多边形(X,Y,Y+1,…,Z)的划分区域数。 根据性质2-1,对半连续多边形(X, Y, Z)可以只考虑顶点X 的划分,划分后的多边形仍然是半连续多边形,于是,状态表示2-2不但可以描述问题的特征,也可以正确描述子问题的特征。考虑到(X,Y,Z)最优划分包含了它的子半连续多边形的最优划分,状态表示2-2描述的子问题满足最优子结构性质。 根据定义,初始多边形是一个半连续多边形,表示为(1,2,N)。状态转移方程为 D(X,Y,Z) = Min {D(Y,Y+1,Z)+g(X,Y,Z), D(X,J,Z)+D(X,Y,J)}, Z<J<Y f(J,I,I) = 0, n+1>I>J>0, 当X,Y,Z在一条直线时,g(X,Y,Z) = 0, 否则g(X,Y,Z) = 1。 状态表示2-2的子问题空间只有 O(n3),动态规划最多可以处理顶点数 80的多边形。以下给出求半连续多边形最优划分区域数的函数。 [算法2-2]: function Dynamic(x, y, z : integer) : integer; {求半连续多边形(x,y, z)的最优划分} var j, tot : integer; begin if D[x, y, z] = 255 then if y - z = 1 then if x,y,z三点共线 then D[x, y, z] := 0 else D[x,y,z] := 1 else begin if 顶点y与顶点z连接合法 then begin D[x,y,z] := Dynamic(y,y+1,z); If x,y,z 三点不共线 then D[x,y,z] := D[x,y,z]+1; End; for j := y + 1 to z - 1 do {j 是顶点x要连接的顶点} if 顶点x与顶点j 连接合法then begin Tot := Dynamic(x, y, j) + Dynamic(x, j, z); {子多边形的最优划分} if Tot < D[x, y, z] then begin D[x, y, z] := Tot; end; end; end; Dynamic := D[x, y, z]; end;
上述两种状态表示都能正确描述多边形,并且描述的多边形都能满足最优子结构性质,从动态规划原理要求来看,已经满足要求了,在状态表示2-1、状态表示2-2基础上可以正确的建立动态规划数学模型。但是,具体实现方面仍有一些问题没有解决。
从图中可以看到,状态表示2-1的空间要求随着顶点数n的增大急剧增长,正如前面所分析的,当n=20时,常用的堆空间就溢出了。而随着顶点数n的增大,状态2-2的空间要求的增大相对就缓慢多了,n一直到81堆空间才溢出。空间方面的要求强烈制约了的动态规划的处理问题能力。因此,应用动态规划时,我们采用的状态表示不仅要满足动态规划原理,还必须考虑实现状态表示的空间要求。这两方面体现了对状态表示正确性、可行性的要求,状态表示必须满足这两个要求,动态规划算法才能实现。
|
|