leetcode 1039. 多边形三角剖分的最低得分(区间dp)

题意:

给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]

假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。

返回多边形进行三角剖分后可以得到的最低分。

 

示例 :

输入:[3,7,4,5]
输出:144
解释:有两种三角剖分,可能得分分别为:3*7*5 + 4*5*7 = 245,或 3*4*5 + 3*4*7 = 144。最低分数为 144。

思路:

思路:区间dp。

dp[i][j]表示,将[i,j]的点组成的多边形的最小和。

k是(i,j)中的点。

这个多边形可以分成三个部分,多边形[i,k],多边形[k,j],三角形(i,j,k);

假设多边形[i,k],多边形[k,j]已知,遍历这个k,可以到这最小值。

然后可以将问题转化为子问题,求解多边形[i,k],多边形[k,j]的最小值。

 1 const int N=50;
 2 class Solution {
 3 public:
 4     int dp[N+10][N+10];
 5     int minScoreTriangulation(vector<int>& A) {
 6         memset(dp,0x3f,sizeof(dp));
 7         int l=A.size();
 8         for(int i=0;i<l;i++)dp[i][i+1]=0;
 9         for(int len=3;len<=l;len++){
10             for(int i=0;i+len-1<l;i++){
11                 int j=i+len-1;
12                 for(int k=i+1;k<j;k++){
13                     dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+A[i]*A[k]*A[j]);
14                 }
15             }
16         }
17         return dp[0][l-1];
18     }
19 };
View Code
posted @ 2019-10-24 18:02  ljy3268  阅读(253)  评论(0编辑  收藏  举报