当前位置: 首页 > news >正文

Leetcode 1039. 多边形三角形剖分的最低得分 枚举型区间dp C++实现

问题:Leetcode 1039. 多边形三角形剖分的最低得分

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。

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

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

算法1:记忆化搜索

时间复杂度:O(n³) 。其中 nvalues 的长度。动态规划的时间复杂度 = 状态个数 × 单个状态的计算时间。本题中状态个数等于 O(n²) ,单个状态的计算时间为 O(n) ,因此时间复杂度为 O(n³)
空间复杂度:O(n²) 。保存多少状态,就需要多少空间。

代码:

class Solution {
public:int minScoreTriangulation(vector<int>& values) {int n = values.size();vector<vector<int>> memo(n,vector<int>(n,-1));auto dfs = [&](auto &&dfs,int i,int j) -> int{if(i + 1 == j)  return 0;//只有两条边,不能构成三角形0int &res = memo[i][j];if(res != -1)   return res;//被计算过res = INT_MAX;for(int k = i + 1;k < j;k++)res = min(res,dfs(dfs,i,k) + dfs(dfs,k,j) + values[i] * values[j] * values[k]);return res;};return dfs(dfs,0,n - 1);}
};

算法2:1:1 翻译成递推

把 dfs 改成 dp 数组,把递归改成循环就好了。相当于原来是用递归计算每个状态 ( i  , j ) ,现在改用循环去计算每个状态 ( i , j ) 。

状态转移方程和递归完全一致

需要注意循环的顺序:

由于 i < kdp [ i ] 要能从 dp [ k ] 转移过来,必须先计算出 dp [ k ],所以 i 要倒序枚举;
由于 j > k dp [ i ] [ j ] 要能从 dp [ i ] [ k ] 转移过来,必须先计算出 dp [ i ] [ k ] ,所以 j 要正序枚举。

时间复杂度:O(n³) 。其中 n values 的长度。动态规划的时间复杂度 = 状态个数 × 单个状态的计算时间。本题中状态个数等于 O(n²) ,单个状态的计算时间为 O(n) ,因此时间复杂度为 O(n³) 

空间复杂度:O(n²) 。有 O(n²) 个状态。

代码:

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • YOLOv8——测量高速公路上汽车的速度
  • 【IDEA】将光标移动到您上一次编辑的地方
  • 物联网迎来下半场,国产 IoTOS 打造企业级智能硬件云服务平台
  • vue 引入 esri-loader 并加载地图
  • Ubuntu磁盘不足扩容
  • NPM如何切换淘宝镜像进行加速
  • Linux入门学习:进程概念
  • ret2dl_resolve
  • gitlab默认克隆地址的修改
  • C# 第一章习题
  • HTTP 教程
  • 9.24 C++ 常成员,运算符重载
  • python爬虫初体验(三)——将网页数据导出csv和excel文件
  • Zero-shot、One-shot、Few-shot 这三种学习分别是什么?
  • 8.11Zero Crossing Detection (零交叉检测)
  • JavaScript-Array类型
  • laravel5.5 视图共享数据
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Next.js之基础概念(二)
  • SQL 难点解决:记录的引用
  • vuex 学习笔记 01
  • 阿里云Kubernetes容器服务上体验Knative
  • 二维平面内的碰撞检测【一】
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端自动化解决方案
  • -- 数据结构 顺序表 --Java
  • 为视图添加丝滑的水波纹
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​Python 3 新特性:类型注解
  • ​字​节​一​面​
  • # wps必须要登录激活才能使用吗?
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Java)【深基9.例1】选举学生会
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (回溯) LeetCode 77. 组合
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .Net Core 笔试1
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET开发人员必知的八个网站
  • .NET与 java通用的3DES加密解密方法
  • .ui文件相关
  • /boot 内存空间不够
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • [ACP云计算]易混淆知识点(考题总结)
  • [C++]类和对象【上篇】
  • [Cloud Networking] Layer3 (Continue)
  • [CQOI 2011]动态逆序对