凸多边形最优三角剖分

来源:互联网 发布:人工智能与无人驾驶 编辑:程序博客网 时间:2024/05/01 09:01

动态规划的经典应用----凸多边形最优三角剖分 

具体的细节讲解,我就不多说啦。网上很多资料,而且讲的非常详细。下面我贴下我做的,虽然大概思路懂了,但是去实现的时候,还是遇到了很多问题。主要是没有正确的理清思路。写下来记录一下。。

#include<iostream>using namespace std;#define MAX 1024int min[MAX][MAX];//m[i][j]节点i开始的连续j个节点的最小值int s[MAX][MAX];//记录需连接的弦int dis[MAX][MAX];//一对节点的权值int weight(int i,int j,int k)//得到任意三个节点的总权值{return dis[i][j]+dis[i][k]+dis[j][k];}void printThePath(int i,int j){int k=s[i][j];if(!k)return;cout<<i<<" "<<i+j-1<<" "<<s[i][j]<<endl;printThePath(i,k-i+1);printThePath(k,i+j-k);}void main(){//可以自己输入int N=6;dis[1][1]=0;dis[1][2]=2;dis[1][3]=2;dis[1][4]=3;dis[1][5]=1;dis[1][6]=4;dis[2][1]=2;dis[2][2]=0;dis[2][3]=1;dis[2][4]=5;dis[2][5]=2;dis[2][6]=3;dis[3][1]=2;dis[3][2]=1;dis[3][3]=0;dis[3][4]=2;dis[3][5]=1;dis[3][6]=4;dis[4][1]=3;dis[4][2]=5;dis[4][3]=2;dis[4][4]=0;dis[4][5]=6;dis[4][6]=2;dis[5][1]=1;dis[5][2]=2;dis[5][3]=1;dis[5][4]=6;dis[5][5]=0;dis[5][6]=1;dis[6][1]=4;dis[6][2]=3;dis[6][3]=4;dis[6][4]=2;dis[6][5]=1;dis[6][6]=0;int i,j;for(i=1;i<=N;i++){for(j=1;j<=N;j++){if(j<3)min[i][j]=0;elsemin[i][j]=MAX;}}/*cout<<"输入多边形点的个数:";cin>>N;int i,j;for(i=1;i<=N;i++){for(j=1;j<=N;j++){cin>>dis[i][j];if(j<3)min[i][j]=0;elsemin[i][j]=MAX;}}*/int temp;int k;for(j=3;j<=N;j++){for(i=1;i<=N-j+2;i++){for(k=i+1;k<i+j-1;k++){temp=weight(i,k,i+j-1)+min[i][k-i+1]+min[k][i+j-k];//动态规划的核心if(temp<min[i][j]){min[i][j]=temp;s[i][j]=k;}}}for(i=1;i<=N-j+2;i++){cout<<"min["<<i<<"]["<<j<<"]="<<min[i][j]<<" ";}cout<<endl;}cout<<min[1][N]<<endl;cout<<"三角形剖片为:"<<endl;printThePath(1,N);}


原创粉丝点击