当前位置: 首页 > 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];}
};


http://www.mrgr.cn/news/34045.html

相关文章:

  • [智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
  • 如何在 Ubuntu 22.04 上安装 ownCloud
  • 刷错学校了—河工大oj 1051- 1072 做题笔记
  • 深入理解接口测试:实用指南与最佳实践5.0(一)
  • 推荐一款好用的postman替代工具2024
  • EasyExcel级联下拉
  • 【C++】面向对象编程的三大特性:深入解析继承机制
  • 【Linux】进程控制
  • 转行要趁早!网络安全岗人才稀缺,前景广阔,零基础入门到精通,收藏这篇就够了
  • 亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~
  • 刚刚更新| Stable diffusion 4.9.7 升级版终于来了!(Ai绘画无需部署,解压即用)
  • C++学习笔记----7、使用类与对象获得高性能(二)---- 理解对象生命周期(8)
  • 数据结构与算法——Java实现 11.习题——有序链表去重
  • [笔记]23年度展会信息— 吊钩 起升机构
  • ElasticSearch分页查询性能及封装实现
  • 数据结构之图论初识
  • 五类ip地址的区别是什么
  • MiniMind环境搭建训练推理测试
  • HBASE_题库详解
  • 一篇讲完HTML核心内容
  • 面试官:Vue.observable你有了解过吗?说说看
  • 时序建模基础——RevIN
  • 适合新手小白挖掘的高危逻辑漏洞
  • 中欧美三方,理解《人工智能安全治理框架》的特点
  • numpy.dot example
  • 一位架构师的自述:在尚未踏入的世界成为你自己