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 };