LeetCode.每日一题 1039. 多边形三角剖分的最低得分
Posted ppeua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode.每日一题 1039. 多边形三角剖分的最低得分相关的知识,希望对你有一定的参考价值。
Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
目录
题目: 多边形三角剖分的最低得分
题解:
这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.
拿出我们传统分析Dp的方法,仍然是求以下几种属性.
那么这里的属性显而易见就是取最小Min.
集合呢?
区间Dp有一个很大的特点就是一个范围的最终状态.
例如这个例子[3,4,5,6,7,8]
其多边形长这样(顺时针)
那么,根据题目所给,一个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++)
所以最开始的情况为这样的
到最后是这样的
也就是从小区间中向大区间递近.最后dp[0][n-1]即为所求答案.
那状态转义方程呢?
观察这样一个图形我们可以发现.当i为5 j为8时
我们再求的是蓝色线以下的最低得分.
那么其可以被切成两个三角形.
我们先来看看绿色线的情况,此时令7这个点叫做k,那么这个区间内的得分就为
dp[i][k]+a[i]*a[j]*a[k]+dp[j][k] 其中dp[j][k]不构成三角形为0,而dp[i][k]为之前所求
再来看看这个例子
当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]
所以
代码实现:
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之每日一题》:278.杨辉三角
杨辉三角
题目链接: 杨辉三角
有关题目
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
题解
法一:二项式定理系数和之间的关系
参考官方题解
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generate(int numRows, int* returnSize, int** returnColumnSizes)
int ** ret = (int**)malloc(sizeof(int*) * numRows);
*returnSize = numRows;
*returnColumnSizes = (int*)malloc(sizeof(int) * numRows);
for (int i = 0; i < numRows; i++)
ret[i] = (int*)malloc(sizeof(int) * (i + 1));
(*returnColumnSizes)[i] = i + 1;
ret[i][0] = ret[i][i] = 1;
for (int j = 1; j < i; j++)
ret[i][j] = ret[i - 1][j - 1] + ret[i - 1][j];//二项式定理系数和之间的关系
return ret;
以上是关于LeetCode.每日一题 1039. 多边形三角剖分的最低得分的主要内容,如果未能解决你的问题,请参考以下文章