(区间dp) 凸多边形最优三角形划分
问题描述:
思路:
将凸多边形的点数组化。发现三角形划分是满足区间叠加的。
dp[i][j],1<=i<=j<=N,代表凸子多边形{vi-1,vi,…,vj}的最优三角剖分所对应的权函数值,即其最优值。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int dp[210][210]; //代表 区间i-1点到j点最优三角形剖分。
int a[210];
int n;
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
// dp[i][j] = dp[i][k]+dp[k+1][j]+a[k]*a[i-1]*a[l];
memset(dp,0,sizeof(dp));
for(int len = 1; len < n-1; len++)
{
for(int i = 1; i+len < n; i++)
{
int r = i, l = i+len;
dp[r][l] = INF;
for(int k = r; k < l; k++)
dp[r][l] = min(dp[r][l],dp[r][k]+dp[k+1][l]+a[k]*a[r-1]*a[l]);
}
}
printf("%d\n",dp[1][n-1]);
}
return 0;
}
/*
5
121
122
123
245
231
*/