LeetCode.每日一题 1039. 多边形三角剖分的最低得分

简介: 这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈



题目: 多边形三角剖分的最低得分


f0c3efa93aea469e98ba1c735502a8e9.png

e1e21e7182de4d919d8597a0738bc60e.png

4c955ecfb70a45a3bf1dd8ece50fbfc8.png


题解:


这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.


拿出我们传统分析Dp的方法,仍然是求以下几种属性.


88e9388891c448389dcf585f463e38a3.jpg


那么这里的属性显而易见就是取最小Min.


集合呢?


区间Dp有一个很大的特点就是一个范围的最终状态.


例如这个例子[3,4,5,6,7,8]

其多边形长这样(顺时针)


c8298e9d3d2545b68900eccd76ae4850.jpg


那么,根据题目所给,一个n边形,可以划分出n-2个三角形.

那么继续往下推,一个n-1边形,可以划分出n-3个三角形

所以n最少为几呢?显然n至少为3,也就是一个三角形最多可以划分出1个三角形(废话)


那么如何表达从某个点到某个点的区间呢


dp[i][j]的含义就自然而然的引出来了,表示第i个与第j个角当中所组成三角形的最低得分

有点像回文子序列的遍历方式,也就是将最大的区间求出.但要求最大的区间,往往需要将小区间求出.

先列出其大概的框架

for(int i=n-3;i>=0;i--)
{
    for(int j=i+2;j<n;j++)
    {
    }
}


所以最开始的情况为这样的


2486fc2133cc4631b2c3540758bae737.jpg


到最后是这样的


eece65144e7e4fc18dcda86e8f6f66a9.jpg


也就是从小区间中向大区间递近.最后dp[0][n-1]即为所求答案.


那状态转义方程呢?

观察这样一个图形我们可以发现.当i为5 j为8时

我们再求的是蓝色线以下的最低得分.

那么其可以被切成两个三角形.

43b7d08a1b9c425aa44b0848f9f72295.jpg


我们先来看看绿色线的情况,此时令7这个点叫做k,那么这个区间内的得分就为


dp[i][k]+a[i]*a[j]*a[k]+dp[j][k] 其中dp[j][k]不构成三角形为0,而dp[i][k]为之前所求


46c17163f43f4780860edace33889847.jpg


再来看看这个例子


3f2ab2152c3a4fa7b57658efc71cdaf9.jpg


当i指向3,j指向8时(也就是首尾),此时k表示切点为5


那么这时这个区间内得分就为,dp[i][k]+dp[k][j]+a[i]*a[k]*a[j], 而dp[i][k]与dp[k][j]之前算过了.

所以状态转移方程为:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])

当然这里还有一个特殊情况,当i与j=0时,也就是还没被求时,其的值就为dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]

所以


ce6c35aca74f4bd7a7a3d80afe6a9820.jpg


代码实现:


class Solution {
public:
    int minScoreTriangulation(vector<int>& values) {
        int n=values.size();
        vector<vector<int>>ans(n,vector<int>(n));
        for(int i=n-3;i>=0;i--)
        {
            for(int j=i+2;i+j<n;j++)
            {
                for(int k=i+1;k<j;k++)
                {
                    if(ans[i][j]==0)
                    {
                        ans[i][j]=ans[i][k]+ans[k][j]+values[i]*values[k]*values[j];
                    }
                    else ans[i][j]=min(ans[i][j],ans[i][k]+ans[k][j]+values[i]*values[k]*values[j]);
                }
            }
        }
        return ans[0][n-1];
    }
};


完结撒花:


🌈本篇博客的内容【LeetCode.每日一题 1039. 多边形三角剖分的最低得分】已经结束。


🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!

目录
相关文章
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
|
6月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大
|
6月前
|
算法 测试技术 C#
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
6月前
|
算法 测试技术 C++
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
算法 C++
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
|
人工智能 算法 C++
每日算法系列【LeetCode 1039】多边形三角剖分的最低得分
每日算法系列【LeetCode 1039】多边形三角剖分的最低得分
104 0
|
前端开发 JavaScript 算法
LeetCode分割字符串的最大得分使用JavaScript解题,击败了100%的用户|前端学算法
LeetCode分割字符串的最大得分使用JavaScript解题,击败了100%的用户|前端学算法
106 0
LeetCode分割字符串的最大得分使用JavaScript解题,击败了100%的用户|前端学算法
|
Python
LeetCode每日一题——857. 雇佣 K 名工人的最低成本
有 n 名工人。 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] 。
136 0
LeetCode每日一题——857. 雇佣 K 名工人的最低成本
LeetCode Contest 186 5392. 分割字符串的最大得分 Maximum Score After Splitting a String
LeetCode Contest 186 5392. 分割字符串的最大得分 Maximum Score After Splitting a String