凸多邊形最優三角剖分(動態規劃)
阿新 • • 發佈:2019-02-06
#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; }