问题:对于一个n个顶点的凸多边形,有很多种方法对它进行三角剖分,n-3条互不相交的边把它分成n-2个三角形,让三角形的权和最大。
输入:第一行输入n,表示n个顶点
后面的n行输入每行包括三个数,I,j,k;
分别为两个顶点的编号以及两点之间线的长度;
输出:剖分三角形最大权和
思路:使用一个n*n的矩阵存储两条边的信息;使用一个n*n的矩阵存储最大权和
t[i][j]表示从i个顶点到j个顶点的最大权和
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<malloc.h>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
int dp[105][105];
int s[105][105];
int main(){
int n;
int i,j;
int a,b,c;
int Max;
int t;
int k;
while(~scanf("%d",n)){
for(i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
s[a][b]=c;
s[b][a]=c;
}
int len;
for(len=2;len<n;len++){
for(i=0;i<n-len+1;i++){
j=i+len-1;
Max=0;
for(k=i;k<j;j++){
t=dp[i][k]+dp[k+1][j]+s[i][k]+s[k+1][j]+s[i][j];
if(t>Max){
t=Max;
}
}
dp[i][j]=Max;
}
}
cout<<dp[0][n-1]<<endl;
}
return 0;
}