1. 程式人生 > >凸多邊形最優三角剖分(動態規劃)

凸多邊形最優三角剖分(動態規劃)

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int N=7;
int Weight(int **w,int a,int b,int c)
{
    return w[a][b] + w[b][c] + w[a][c];
}

int MinWeightTriangulation(int n,int **t,int **s,int **w)///計算最優值
{
    ///這個方法和矩陣連乘差不多,只是在矩陣連乘的基礎上稍稍修改即可
    for(int i=1;i<=n;i++)///先對斜對角線進行初始化
        t[i][i]=0;
    for(int r=2;r<=n;r++)///(2,3,4,5,6....n)
       for(int i=1;i<=n-r+1;i++)///因為r=n-i+1
       {
        int j=i+r-1;
        t[i][j]=t[i][i]+t[i+1][j]+Weight(w,i-1,i,j);
        s[i][j]=i;///在i處分割,所以記錄下來
        for(int k=i+1;k<j;k++)///此時需要從i+1開始分割
        {
            int u=t[i][k]+t[k+1][j]+Weight(w,i-1,k,j);
            if(u<t[i][j])
                {
                    t[i][j]=u;
                    s[i][j]=k;
                }
        }
       }
       return t[1][N-2];
}

void TackBack(int i,int j,int **s)
{
    if(i==j)
     return;
    else
    {
     TackBack(i,s[i][j],s);
     TackBack(s[i][j]+1,j,s);
      cout<<"三角剖分頂點:V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl;
    }
}

int main()
{
   ///{{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};凸多邊形的權
    int **t=new int *[N];
    int **s=new int *[N];
    int **w=new int *[N];
    for(int i=0;i<N;i++)
    {
        t[i]=new int[N];
        s[i]=new int[N];
        w[i]=new int[N];
    }
    cout<<"請輸入"<<N-1<<"行"<<N-1<<"列"<<"凸多邊形最優三角剖分的權"<<endl;
    for(int i=0;i<N-1;i++)
        for(int j=0;j<N-1;j++)
       {
        cin>>w[i][j];
       }
    cout<<endl<<endl<<"輸出"<<N-1<<"行"<<N-1<<"列"<<"凸多邊形最優三角剖分的權"<<endl;
    for(int i=0;i<N-1;i++)
    {
        for(int j=0;j<N-1;j++)
       {
        cout<<"\t"<<w[i][j];
       }
       cout<<endl;

    }
    cout << endl<<endl<<"輸出凸多邊形最優三角剖分的計算最優值為:" <<MinWeightTriangulation(N-1,t,s,w);
    cout<<endl<<endl<<"輸出凸多邊形最優三角剖分結構為:"<<endl<<endl;
    TackBack(1,5,s);
    return 0;
}