每日算法系列【LeetCode 1039】多边形三角剖分的最低得分

简介: 给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]。假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。返回多边形进行三角剖分后可以得到的最低分。

题目描述


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

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

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

示例1

输入:
[1,2,3]
输出:
6
解释:
多边形已经三角化,唯一三角形的分数为 6。

示例2

image.png

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

示例3

输入:
[1,3,1,4,1,5]
输出:
13
解释:
最低分数三角剖分的得分情况为 1*1*3 + 1*1*4 + 1*1*5 + 1*1*1 = 13。

提示

  • 3 <= A.length <= 50
  • 1 <= A[i] <= 100

题解



image.png

可以发现,一刀下去,两个多边形只有一条边是在内部,其他边都是连续的外围的边,如下图所示:

image.png


image.png

image.png


image.png

image.png


image.png

代码


c++

classSolution {
public:
staticconstintN=55; 
intdp[N][N];
intminScoreTriangulation(vector<int>&A) { 
intn=A.size(); 
memset(dp, 0, sizeofdp);  
for (intlen=3; len<=n; ++len) {  
for (inti=0; i<n; ++i) { 
intj=i+len-1; 
inttmp=INT_MAX;  
for (intk=i+1; k<j; ++k) { 
tmp=min(tmp, A[i]*A[j%n]*A[k%n]+dp[i]
                              [k%n]+dp[k%n][j%n]); 
                }   
dp[i][j%n] =tmp;  
            }   
        }   
returndp[0][n-1]; 
    }
};

python

classSolution: 
defminScoreTriangulation(self, A: List[int]) ->int:
n=len(A) 
dp= [[0]*nfor_inrange(n)]  
forlinrange(3, n+1):
foriinrange(n): 
j=i+l-1tmp=0x3f3f3f3fforkinrange(i+1, j): 
tmp=min(tmp, A[i]*A[j%n]*A[k%n]+dp[i]
                              [k%n]+dp[k%n][j%n]) 
dp[i][j%n] =tmpreturndp[0][n-1]

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
10月前
|
索引
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
|
1月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大
|
1月前
|
算法 测试技术 C#
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
1月前
|
算法 测试技术 C++
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
10月前
|
人工智能 算法 C语言
LeetCode.每日一题 1039. 多边形三角剖分的最低得分
这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.
69 0
|
算法 C++
【每日算法Day 77】LeetCode 第 181 场周赛题解
【每日算法Day 77】LeetCode 第 181 场周赛题解
|
算法 C++
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
|
算法 C++ Python
【每日算法Day 63】LeetCode 第 179 场周赛题解
起床打开 leetcode,准备看看今天搞点啥题目水一水的,突然发现周赛还剩 1 小时整。看了眼题目也都挺简单的,就把 4 道题都做掉了。
|
算法 C++
【每日算法Day 62】LeetCode 815. 公交路线
【每日算法Day 62】LeetCode 815. 公交路线
|
算法 C++ Python
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ