和矩阵连乘类似。。。
#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);
}