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

news2024/12/25 1:46:45

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

剖出来的三角形是否有交叉,这题中如果加一个三角形之间没有任何交集除了边,会更好理解一点。然后我们就是这么去知道该怎么剖三角形,知道该怎么剖三角形之后。我们再来考虑这是道什么题目,爆搜三角形的乘积的话,我们是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.coloradmin.cn/o/1413220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

【Linux】进程概述

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

FlashInternImage实战:使用FlashInternImage实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装DCNv4环境安装过程配置CUDAHOME解决权限不够的问题 按装ninja编译DCNv4 计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2401.06197.pdf 论文介绍了Deformable Convolution v4&#xff08;DCNv4&…

单片机学习笔记---动态数码管显示

上一节我们得出一个结论&#xff0c;多位一体的数码管不可能在同一时刻显示多个不同数字&#xff0c;即使有多位选中的话&#xff0c;那显示的数字也会是相同的。这是由于他们共用引脚导致的这个现象。当然这也是为了节省引脚的连接方式&#xff0c;方便操作。 那这样的连接方式…

React中使用LazyBuilder实现页面懒加载方法二

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

NC开发客户端(前端)连接启动失败can‘t connect to server, please wait

效果图 解决方法 IP地址和端口要对应 1-IP地址中间启动&#xff0c;肯定是这个127.0.0.1 2-端口号&#xff0c;要对应中间件启动在控制台输出的端口 或者是在home目录-》bin-》sysConfig.bat这里面的服务器&#xff0c; 里面可以看到对应启动ip地址和端口

浪花 - 响应拦截器(强制登录)

1. 配置响应拦截器 import axios from axios;const myAxios axios.create({baseURL: http://localhost:8080/api/, });myAxios.defaults.withCredentials true;// 请求拦截器 myAxios.interceptors.request.use(function (config) {// Do something before request is sentc…

【C++】list讲解及模拟

目录 list的基本介绍 list模拟实现 一.创建节点 二.迭代器 1.模版参数 2.迭代器的实现&#xff1a; a. ! b. c. -- d. *指针 e.&引用 整体iterator (与const复用)&#xff1a; 三.功能实现 1.模版参数 2.具体功能实现&#xff1a; 2.1 构造函数 2.2 begi…

第139期 做大还是做小-Oracle名称哪些事(20240125)

数据库管理139期 2024-01-25 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09;1 问题2 排查3 扩展总结 第139期 做大还是做小-Oracle名称哪些事&#xff08;20240125&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle A…

云计算中的弹性是什么?

云弹性是指当客户需求增加或减少时&#xff0c;自动从数据中心配置和取消配置资源。这使得云资源(包括计算、存储和内存资源)能够根据需求变化快速重新分配。CPU/处理、内存、输入/输出带宽和存储容量等计算资源可以根据需要增加或减少&#xff0c;而不会影响系统性能。 它旨在…

前端工程化基础(一):Node模块化

Node模块化 Node.js是什么 官方定义&#xff1a;Node.js是一个基于V8 JavaScript引擎的JavaScript运行时的环境 Node.js基于V8引擎来执行 JavaScript代码&#xff0c;但是Node.js中不仅仅有V8 我们知道&#xff0c;V8可以嵌入到C应用程序中&#xff0c;因此无论是Chrome还是No…

EventSource 长链接执行

EventSource 说明文档MDN 其他参考文档 一、利用node启服务 import fs from fs import express from express const app express() // eventSource 仅支持 get 方法 // 服务器端发送的数据必须是纯文本格式&#xff0c;不能是二进制数据。 app.get(/api, (req, res) > …

智能AI系统开发,专业软件硬件物联网开发公司,探索未来科技新纪元

在信息时代&#xff0c;人工智能&#xff08;AI&#xff09;、物联网等前沿技术日益受到人们的关注。智能AI系统、专业软件硬件物联网开发公司应运而生。今天&#xff0c;我们将向大家介绍一家位于XX城的专业公司&#xff0c;致力于智能AI系统开发和软件硬件物联网领域的创新研…

光学系统的核心--分辨率

前言 在机器视觉领域&#xff0c;可以把各个部件划分为光源&#xff0c;镜头&#xff0c;相机&#xff0c;采集卡&#xff0c;算法&#xff0c;运动平台等。各个部件都是系统的有机组合&#xff0c;均有各自的重要性。在实际应用中&#xff0c;成像镜头涉及的光学理论较多&…

Vue 响应式原理源码剖析

文章目录 1. 说明2. 初始化initState()initProps()initData()observe()ObserverdefineReactive() 3. 数据代理4. 模板解析4.1. 模板解析的基本流程4.2. 模板解析(1): 大括号表达式解析4.3. 模板解析(2): 事件指令解析4.4. 模板解析(3): 一般指令解析 5. 数据绑定5.1. 数据绑定5…

实体识别与分类方法综述

目录 前言1 实体识别简介2 基于模板和规则的方法3 基于序列标注的方法3.1 常见序列标注模型3.2 模型参数估计和学习问题3.3 常见序列预测模型 4. 基于深度学习的实体识别方法5 基于预训练语言模型的实体识别5.1 BERT、GPT等预训练语言模型5.2 解码策略 6 特殊问题与挑战6.1 标签…

Ultraleap 3Di新建项目之给所有的Joint挂载物体

工程文件 Ultraleap 3Di给所有的Joint挂载物体 前期准备 参考上一期文章&#xff0c;进行正确配置 Ultraleap 3Di配置以及在 Unity 中使用 Ultraleap 3Di手部跟踪 新建项目 初始项目如下&#xff1a; 新建Create Empty 将新建的Create Empty&#xff0c;重命名为LeapPro…

10-微服务Nacos Config的通用配置

一、解决不同环境相同配置问题-自定义Data ID配置 在实际的开发过程中&#xff0c;我们的项目所用到的配置参数有的时候并不需要根据不同的环境进行区分&#xff0c;生产、测试、开发环境所用到的参数值是相同的。那么解决同一服务在多环境中&#xff0c;引用相同的配置的问题…

HTTP中POST、GET、PUT、DELETE方式的区别

GET请求会向数据库发索取数据的请求&#xff0c;从而来获取信息&#xff0c;该请求就像数据库的select操作一样&#xff0c;只是用来查询一下数据&#xff0c;不会修改、增加数据&#xff0c;不会影响资源的内容&#xff0c;即该请求不会产生副作用。无论进行多少次操作&#x…