dp 最优三角剖分问题

来源:互联网 发布:java方法调用方法 编辑:程序博客网 时间:2024/06/06 08:53

额,基本和算法分析上的差不多,只是更加了解dp的状态吧

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<cstring>using namespace std;#define max 100int n; int t[max][max], s[max][max];int value[max][max]; int w(int i, int j, int k){    return value[i][j] +value[j][k] + value[k][i];}int MinWeight(int n, int t[max][max], int s[max][max]){     for(int i=1; i<=n; i++) t[i][i] = 0;     for(int r=2; r<=n; r++)     for(int i=1; i<=n-r+1; i++)     {       int j = i+r-1;       t[i][j] = t[i+1][j] +w(i-1,i,j);       s[i][j] = i;       for(int k=0; k<i+r-1; k++)       {        int u = t[i][k] + t[k+1][j] + w(i-1,k,j);        if(u<t[i][j])         {          t[i][j] = u;          s[i][j] = k;        }       }      }     return t[1][n];} int main(){    int ncase;    int a, b, c;    scanf("%d",&ncase);    while(ncase--)    {      scanf("%d",&n);      for(int i=1; i<=n*(n-1)/2; i++)      {      cin>>a>>b>>c;      value[a][b] = c;      value[b][a] = c;      }      int min = MinWeight(n, t, s);      printf("%d\n",min);      for(int i=1; i<n; i++)      for(int j=i+1; j<i/2; j++)      printf(" %d %d %d ",i, j, s[i][j]);    }    system("pause");   return 0;}