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

这题的难点在哪部分呢,其实是怎么思考。这道题如果之前没做过类似的话,还是很难看出一些性质的,这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来

剖出来的三角形是否有交叉,这题中如果加一个三角形之间没有任何交集除了边,会更好理解一点。然后我们就是这么去知道该怎么剖三角形,知道该怎么剖三角形之后。我们再来考虑这是道什么题目,爆搜三角形的乘积的话,我们是n^3,爆搜四边形的乘积的话是这个就不好说了,因为四边形也是由多个是三角形组成的,五边形六边形等等同理

本题中,我们要求的是多边形中能切出的三角形的乘积,我们现在爆搜只是知道多边形中每个三边型的乘积最小值(因为是三角形所以最小值是确定的),并不知道多边形的乘积最小是多少,那么我们三角形其实也算是多边形,但是在本题中他是特殊的三角多边形,而我现在的情况是要求出四边形,五边形,六边型......的乘积最小值,那么知道了这个情况之后,我们再去思考下一步,就是确认是否有递推性质,四边形的最小值是由多个组合的三边形的和中的最小值决定的,那五边形呢?那五边形是不是可以划分为一个四边形和一个三边形,六边形是不是可以划分为一个一个五边形和四边形,我们发现了一个性质,我们可以从三边形的最小值递推到n边形,那么我们就知道了这题目具有递推性质,具有递推性质我们可以用记忆化搜索和动态规划来解决。

前面这些我们是知道整体思路是什么,是本题具有递推性质。那么现在我们就可以根据递推性质来找解决办法了。

那么知道了解决办法后,还有一个难点就是,怎么算这些多边形的乘积。

那么我们现在只知道每一个三角形的乘积,这个三角形的乘积我们是已知的,然后多枚举几个发现一个性质,每个三角形都能把多边形分成三部分,发现三角形可以将整体分成三部分,再继续发现一个性质,不管你以那个三角形分成左右两边,有几个三角形的一条边一定是固定的,也就是外边,那么只要我们枚举外边的任意一个边的所有三角形就可以知道所有组成多边形的三角形最小值了。

知道了怎么算多边形,那么我们现在就是可以确定用什么方法了。动态规划和记忆化搜索都行

先来个记忆化搜索

i < k < j

class Solution {
public:
    int f[110][110];
    int minScoreTriangulation(vector<int>& values) 
    {
        memset(f,0x3f3f3f3f,sizeof(f));

        function<int(int, int)> dfs = [&](int i,int j)->int
        {
             if(abs(i - j) <= 1)
             {
                 return 0;
             }
             if(f[i][j] != 0x3f3f3f3f) return f[i][j];
             for(int k = i + 1;k < j;k++)
             {
                f[i][j] = min(f[i][j],dfs(i,k) + dfs(k,j) + values[i]*values[j]*values[k]);
             }
             return f[i][j];
        };

        dfs(0,values.size() - 1);
        return f[0][values.size() - 1];
    }
};

动态规划:

动态规划部分的话,我们其实在计算的时候,我们的四边形依赖于三边形,五边形依赖于四边形和三边形,六边形同理等等,那么我们就可以根据长度为阶段,然后后面的部分就是固定左和右端点,然后枚举k就行,i < k < j

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 70;

int n;
int a[N];
__int128 f[N][N];
ostream &operator << (ostream &out,__int128 x) {
    if (!x) {
        out << 0;
        return out;
    }
    int stk[110],top = 0;
    while (x) stk[++top] = x % 10,x /= 10;
    for (int i = top;i >= 1;i--) out << stk[i];
    return out;
}
int main()
{
    cin>>n;
    
    for(int i = 1;i <= n;i++)
    {
        cin>>a[i];
    }
    //memset(f,0x3f,sizeof f);
    for(int len = 1;len <= n;len++)
    {
        for(int l = 1,r;r = l + len - 1,r <= n;l++)
        {
            if(len < 3) f[l][r] = 0;
            else
            {
                f[l][r] = 1e29;
            for(int k = l + 1;k < r;k++)
            {
                f[l][r] = min(f[l][r],f[l][k] + f[k][r] + (__int128)a[l] * a[k] * a[r]);
            }
            }
        }
    }
    
    cout<<f[1][n]<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/351054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS应用开发】TypeScript快速入门(二)

内容比较长&#xff0c;干货满满&#xff0c;全是实战操作内容&#xff0c;希望耐心观看&#xff0c;如果对你有所帮助&#xff0c;请点个赞&#xff01; ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI…

力扣hot100 课程表 拓扑序列

Problem: 207. 课程表 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 三叶题解 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution{int N 100010, M 5010, idx;int[] in new int[N];// in[i] 表示节…

第六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:摄像头标定

传奇开心果博文系列 系列博文目录Python的OpenCV库技术点案例示例系列 博文目录一、前言二、OpenCV摄像头标定介绍三、摄像头内外参数标定示例代码和扩展四、立体视觉标定示例代码和扩展五、归纳总结 系列博文目录 Python的OpenCV库技术点案例示例系列 博文目录 一、前言 O…

一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率二、使用步骤1、研究背景2、方法提出3、相关方法3.1、FSR网络结构3.2…

【微信小程序】常用的几种轮播图

轮播效果一 wxml: <view classpageBox pageOne><view classlist><swiper indicator-dots"{{true}}" autoplay"{{false}}" previous-margin"{{140rpx}}" next-margin"{{140rpx}}" bindchange"swiperChange"&…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…

算子:详细篇

目录 一、执行环境 1.1 创建执行环境 1.2 执行模式 二、源算子 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从socket读取数据 2.4 从kafka读取数据 三、转换算子 3.1 基本转换算子 &#xff08;1&#xff09;映射(map) &#xff08;2&#xff09;过滤(filter) &#xff08…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

云手机哪一款好用?

随着海外市场的不断发展&#xff0c;云手机市场也呈现蓬勃的态势&#xff0c;众多云设备软件纷纷涌现。企业在选择云手机软件时&#xff0c;如何找到性能卓越的软件成为一项关键任务。在众多选择中&#xff0c;OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

一文详解C++拷贝构造函数

文章目录 引入一、什么是拷贝构造函数&#xff1f;二、什么情况下使用拷贝构造函数&#xff1f;三、使用拷贝构造函数需要注意什么&#xff1f;四、深拷贝和浅拷贝浅拷贝深拷贝 引入 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。 相当…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…

CSC签证费报销的相关规定及要求-主要国家签证费报销凭据

国家留学基金委&#xff08;CSC&#xff09;派出流程很多是在留学服务机构办理&#xff0c;即北京教育部留学服务中心及教育部出国人员上海集训部&#xff0c;其中含签证费报销。本篇知识人网小编以上海集训部为例&#xff0c;详细解读一下签证费报销的相关规定及要求&#xff…

sql 行转列 日周月 图表统计

目录 目录 需求 准备 月 分析 按月分组 行转列 错误版本 正确版本 日 分析 行转列 周 分析 按周分组 行转列 本年 需求 页面有三个按钮 日周月&#xff0c;统计一周中每天(日)&#xff0c;一月中每周(周)&#xff0c;一年中每月(月)&#xff0c;设备台数 点…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文&#xff0c;本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

Leetcode—114. 二叉树展开为链表【中等】

2023每日刷题&#xff08;九十八&#xff09; Leetcode—114. 二叉树展开为链表 Morris-like算法思想 可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题中序遍历的 Morris 算法有些神似&#xff0c;我们需要两步完成这道题。 将左子树插入到右子树的地方将原来的右…

Java - OpenSSL与国密OpenSSL

文章目录 一、定义 OpenSSL&#xff1a;OpenSSL是一个开放源代码的SSL/TLS协议实现&#xff0c;也是一个功能丰富的加密库&#xff0c;提供了各种主要的加密算法、常用的密钥和证书封装管理功能以及SSL协议。它被广泛应用于Web服务器、电子邮件服务器、VPN等网络应用中&#x…

线性表--栈

1.什么是栈&#xff1f; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff…

YOLOv5改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程&#xff1a; 数据预处理&#xff1a;图像数据处理&#xff0c…
最新文章