和矩阵连乘类似。。。
#include<iostream> #include<string.h> using namespace std; #define N 6 #define INF 99999999 int m[N][N],s[N][N]; int weight[][6] = {{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 get_weight(const int a, const int b, const int c) { return weight[a][b] + weight[b][c] + weight[c][a]; } void back_track(int a, int b) { if (a == b) return; back_track(a,s[a][b]); back_track(s[a][b]+1,b); //记得这是要加一 cout<<"最优三角:V"<<a-1<<" V"<<s[a][b]<<" V"<<b<<endl; } int main() { memset(m,0,sizeof(m)); memset(s,0,sizeof(s)); int i,j,k,l; for(l=2;l<N;++l) { for(i=1;i<=N-l+1;++i) { j=i+l-1; m[i][j]=INF; for(k=i;k<=j-1;++k) { int q=m[i][k]+m[k+1][j]+get_weight(i-1,k,j); if(q<m[i][j]) { m[i][j]=q; s[i][j]=k; } } } } cout<<m[1][N-1]<<endl; cout<<endl; back_track(1,5); }