当前位置:嗨网首页>书籍在线阅读

39-伪代码详解

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.7.4 伪代码详解

(1)凸多边形三角剖分求解函数

首先将数组m[][]、s[][]初始化为0,然后自底向上处理不同规模的子问题,d为i到j的规模,d=2;d<=n;d++,当d=2时,实际上是3个点,因为m[i][j]表示的是{vi−1,vi,vj}。求解3个顶点凸多边形三角剖分的最优值和最优策略,根据递归式:

371.gif 对每一个k值,求解,找到最小值后用m[i][j]记录,并用s[i][j]记录取得最小值的k值。

void Convexpolygontriangulation()
{
    for(int i = 1 ;i <= n ; i++) // 初始化
    {
         m[i][i] = 0 ;
         s[i][i] = 0 ;
    }
    for(int d = 2 ;d <= n ; d++)  //d为i到j的规模,d=2时,实际上是三个点
                                  //因为我们的m[i][j]表示的是{vi-1,vi,vj}
      for(int i = 1 ;i <= n - d + 1 ; i++) //控制i值
      {
           int j = i + d - 1 ;             // j值
           m[i][j] = m[i+1][j] + g[i-1][i] + g[i][j] + g[i-1][j] ;
           s[i][j] = i ;
           for(int k = i + 1 ;k < j ; k++) // 枚举划分点
           {
                double temp = m[i][k] + m[k+1][j] + g[i-1][k] + g[k][j] + g[i-1][j] ;
                if(m[i][j] > temp)
                {
                     m[i][j] = temp ;      // 更新最优值
                     s[i][j] = k ;         // 记录划分点
                }
           }
      }
}

(2)最优解输出函数

我们首先从s[][]数组中读取s[i][j],然后判断子问题1是否为空。若s[i][j]>i,表示i到s[i][j]之间存在顶点,子问题1不为空,那么vi−1vs[i][j]是一条弦,输出{vi−1vs[i][j]};判断子问题2是否为空,若j>s[i][j]+1,表示s[i][j]+1到j之间存在顶点,子问题2不为空,那么vs[i][j]+1 vj是一条弦,输出{vs[i][j]+1vj}。递归求解子问题1和子问题2,直到i=j时停止。

void print(int i , int j)                  // 输出所有的弦
{
     if(i == j)  return ;
     if(s[i][j]>i)
        cout<<"{v"<<i-1<<"v"<<s[i][j]<<"}"<<endl;
     if(j>s[i][j]+1)
        cout<<"{v"<<s[i][j]<<"v"<<j<<"}"<<endl;
     print(i ,s[i][j]);
     print(s[i][j]+1 ,j);
}