当前位置:编程学习 > C/C++ >>

凸多边形最优三角剖分

动态规划的经典应用----凸多边形最优三角剖分 
 
具体的细节讲解,我就不多说啦。网上很多资料,而且讲的非常详细。下面我贴下我做的,虽然大概思路懂了,但是去实现的时候,还是遇到了很多问题。主要是没有正确的理清思路。写下来记录一下。。
 
 
<span style="font-size:18px">#include<iostream>  
using namespace std;  
  
#define MAX 1024  
int 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;  
            else  
                min[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; 
            else 
                min[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);  
}</span>  

 

 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,