C++---区间DP/高精度计算---凸多边形的划分(每日一道算法2023.4.27)

news2025/1/21 15:26:52

注意事项:
本题是"区间DP—能量项链"的扩展题,可以先理解下那道题。
本题使用了"高精度乘法"和"高精度加法",可以去这两篇文章看,有详解。

题目:
给定一个具有 N 个顶点的凸多边形,将顶点从 1 至 N 标号,每个顶点的权值都是一个正整数。

将这个凸多边形划分成 N−2 个互不相交的三角形,对于每个三角形,其三个顶点的权值相乘都可得到一个权值乘积,试求所有三角形的顶点权值乘积之和至少为多少。

输入格式
第一行包含整数 N,表示顶点数量。
第二行包含 N 个整数,依次为顶点 1 至顶点 N 的权值。

输出格式
输出仅一行,为所有三角形的顶点权值乘积之和的最小值。

数据范围
N≤50,
数据保证所有顶点的权值都小于10^9

输入:
5
121 122 123 245 231
输出:
12214884
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long LL;
const int N = 55;
int n, w[N];            //w[i]为第i个顶点的权值
vector<int> f[N][N];  //注意这是个三维数组(第三维是用来算高精度),f[l][r]为从l点到r点整个区域内的不相交的三角形的选法,属性为min(三角形权值之和)

//高精度加法
vector<int> add(vector<int> &A, vector<int> &B) {
    if (A.size() < B.size()) return add(B, A);
    vector<int> res;
    int t = 0;
    for (int i = 0; i<A.size(); i++) {
        t += A[i];
        if (i < B.size()) t += B[i];
        res.push_back(t % 10);
        t /= 10;
    }
    if (t) res.push_back(t);
    return res;
}

//高精度乘法
vector<int> multi(vector<int> &A, LL B) {
    vector<int> res;
    LL t = 0;
    for (int i = 0; i<A.size() || t; i++) {
        if (i < A.size()) t += (A[i] * B);
        res.push_back(t % 10);
        t /= 10;
    }
    while (res.size() > 1 && res.back() == 0) res.pop_back();
    return res;
}

//高精度比较 compare(A < B)?
bool cmp(vector<int> &A, vector<int> &B) {
    if (A.size() != B.size()) return A.size() < B.size();
    for (int i = A.size()-1; i>=0; i--) {
        if (A[i] != B[i]) {
            return A[i] < B[i];
        }
    }
    return true;
}

int main() {
    //读入
    cin >> n;
    for (int i = 1; i<=n; i++) cin >> w[i];

    //dp (区间长度len -> 左端点l -> 分界线k)
    for (int len = 3; len <= n; len++) {
        for (int l = 1; l+len-1 <= n; l++) {
            int r = l+len-1;
            for (int k = l+1; k<r; k++) {
                vector<int> new_value;
                new_value.push_back(1);     //初始化设为1,这样就能计算乘法了
                //w[l]*w[k]*w[r]
                new_value = multi(new_value, w[l]);
                new_value = multi(new_value, w[k]);
                new_value = multi(new_value, w[r]);
                //f[l][k] + f[k][r]
                new_value = add(new_value, f[l][k]);
                new_value = add(new_value, f[k][r]);
                //f[l][r] = min(f[l][r], new_value)
                if (f[l][r].empty() || cmp(new_value, f[l][r])) f[l][r] = new_value;
            }
        }
    }

    //f[1][n]为答案,注意存的是高精度,所以要倒着输出一下
    for (int i = f[1][n].size()-1; i>=0; i--) cout << f[1][n][i];
    return 0;
}

思路:
先来理解讲下题目吧,
在选定两个点后,和剩余的点组成三角形的方案为n-2个(彩铅佬的图):请添加图片描述
对于任意一个这样的三角形,都可以用它来划分区间(假设选择1-4-6这个三角形):
请添加图片描述
那么左侧区间(1-2-3-4)和右侧区间(4-5-6)互不干扰,
就可以求出左侧区间的最小值f[1][4]和右侧区间的最小值f[4][6]再加上当前w[1]*w[4]*w[6],即为选择(1-4-6)这个三角形的答案。

然后动态规划,还是经典的y式dp法:
1.状态表示
f[L][R]: 当前区域(多边形)的最左侧端点为L,最右侧端点为R的所有方案,
属性为Min(三角形权值的和)。
2.状态计算
以L和R为底边,分界点K为顶点:
左侧区间 + 当前三角形权值 + 右侧区间
f[l][r] = min(f[l][r], f[l][k] + f[k][r] + w[l]*w[k]*w[r])

如果有所帮助请给个免费的赞吧~有人看才是支撑我写下去的动力!

声明:
算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流

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

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

相关文章

什么是SSO?

SSO&#xff08;Single Sign On&#xff09;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。 当…

中山大学_程序设计新手赛2023_4题的小朋友_总结

送自己一句话&#xff1a;即使生活很不顺利&#xff0c;也不要成为一个连自己都讨厌的人 那样&#xff0c;当你有一天回首过往&#xff0c;只不过是在演戏中匆匆做过这一生 题目&#xff1a;见我上传的资源 A:关于时间复杂度 解&#xff1a; 1.关键&#xff1a; 法一&…

前端开发之axios请求封装详细讲解

前端开发之axios请求封装 前言1、安装axios2、创建公共文件request3、导入axiso4、初始化axios5、axios请求拦截器6、axios响应拦截器7、handleData&#xff1a;处理请求后来的response8、CODE_MESSAGE&#xff1a;code信息 前言 在vue项目中&#xff0c;和后台交互获取数据这…

openEuler社区人才评定考试流程指引

最近因为公司工作的需要参加考试了openEuler社区人才评定考试&#xff0c;本次考试题型主要包括单选、多选、判断三类题型。考试内容基本都是操作系统使用相关的内容。 考试需要注意事项&#xff1a; 1.考试为线上答题考试&#xff0c;需开启摄像头。 2.考试期间请保持周围环…

SQL server增删改查(1)

SQL server数据类型 整数型: BIGINT INT SMALLINT 小数型: FLOAT DOUBLE 文本型: CHAR VARCHAR NCHAR NVARCHAR TEXT 日期和时间类型 DATE TIME DATETIME 布尔型: BIT 数据类型含义INT长整数(也可以写作INTEGER)SMALLINT短整数CHAR(n)长度为n的定长字符串, 不足n个字符的空白部…

Scala语言入门以及基本语法

文章目录 前言1.环境搭建1) IDEA中插件下载2) SDK下载配置 2.基本使用1&#xff09;var与val的区别2) .基本数据类型3).字符串的基本用法4) 控制结构1) if else2) for 循环3) while循环 5)类6) 函数 前言 scala在一种简洁的高级语言中结合了面向对象和函数式编程。Scala的静态…

8个免费的PNG素材网站推荐

很多设计小白都不知道什么是PNG。事实上&#xff0c;PNG是一种支持透明度的图像格式。当你想在设计中将图像与背景或文本混合时&#xff0c;它就会派上用场。 如果你没有时间为你正在处理的设计创建透明的PNG图像&#xff0c;你也可以使用我收集的PNG素材网站&#xff0c;以便…

【Linux从入门到精通】Linux常用基础指令(中)

本篇文章接上篇文章&#xff08;【Linux从入门到精通】Linux常用基础指令&#xff08;上&#xff09;&#xff09;进行详解。本章的指令相对较为重要&#xff0c;使用频率较高&#xff0c;难度相对上篇文章较难&#xff0c;也较为复杂。希望能对你的理解有所帮助。 文章目录 一…

(Open AI 极简教程)ChatGPT注册登录常见问题及其解决方法最全总结

好久没有更新过技术类的文章了&#xff0c;临近五一假期&#xff0c;首先祝大家假期游玩愉快&#xff0c;也希望本篇文章能够对你有所帮助&#xff0c;今天这篇博客将会把ChatGPT注册中可能遇到的问题彻头彻尾的讲一下&#xff0c;如果感觉有帮助的话就动动你发财的小手点个收藏…

蓝奥声核心技术分享——一种无线低功耗配置技术

1.技术背景 无线低功耗配置技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及物联网边缘域的无线通信技术领域&#xff0c;具体主要涉及网络服务节点…

3.龙芯2k1000 builroot文件系统编译过程

3.龙芯2k1000 builroot文件系统编译过程 文章目录 3.龙芯2k1000 builroot文件系统编译过程&#xff08;一&#xff09;、在Ubuntu环境下载并配置交叉编译链&#xff08;与内核编译工具链相同&#xff09;&#xff08;二&#xff09;、下载buildroot源码&#xff08;三&#xff…

【Linux命令篇】正则表达式浅析

前言 转义字符是将普通字符转化为特殊字符的一种方式。 在正则表达式中&#xff0c;一些字符被定义为特殊字符&#xff08;也称为元字符&#xff09;&#xff0c;它们具有特殊的含义。这些特殊字符包括&#xff1a; 句点字符 .&#xff1a;可以匹配除了换行符以外的任何单个…

JavaScript经典教程(四)-- JavaScript基础 - BOM、打印、window对象等详解

184&#xff1a;JavaScript基础 - BOM、打印、window对象等详解 185&#xff1a;JavaScript基础 - 数据类型Number及运算符号 1、关键字 &#xff08;3&#xff09;alert - 警告窗 原型&#xff1a;window.alert(); alert实际上是一个函数 注&#xff1a;alert无法弹出部分…

Figma如何导出jpg格式?

在这个追求效率和质量的时代&#xff0c;Figma确实可以加快我们的设计工作&#xff0c;增加效率&#xff0c;功能越来越强大。然而&#xff0c;Figma从未有过中文版本。 但就使用工具而言&#xff0c;一次生两次并不难。设计小白经常卡在最后一步&#xff0c;如何用Figma导出j…

【Paper】2022_基于自适应事件触发控制的一般线性多智能体系统的一致性_田昌源

田昌源. 基于自适应事件触发控制的一般线性多智能体系统的一致性[D].青岛大学,2022.DOI:10.27262/d.cnki.gqdau.2022.002546. 文章目录 第五章 一般线性多智能体系统的自适应事件触发二分一致性5.1 系统模型5.2 自适应事件触发二分一致性5.2.1 无领导一致性5.2.2 领导-跟随一致…

JDK的环境配置(超级详细教程)

JDK的环境配置——超详细教程 一、下载java安装包 我们可以去官网下载java&#xff0c;进入官网页面&#xff0c;然后点击Download Java。 网站&#xff1a;https://developer.oracle.com/languages/java.html 里面有各种版本的jdk可供选择。 二、安装JDK 这里我选择安装…

Android实现一个带清除和提交按钮的清爽圆角搜索框

运行效果&#xff1a; 放入Toolbar的效果 清除按钮有内容才显示&#xff1a; 下面是教程&#xff1a; 实现一个圆角搜索框&#xff0c;可以使用CardView来实现&#xff0c;同时可以添加一个EditText和两个ImageView作为清除和提交按钮。 activity_main <?xml version&quo…

Anaconda3 安装 Tensorflow-gpu

一.准备需要 GPU版本&#xff0c;需要提前下载 cuda 和 cuDNN。&#xff08;可以查看此教程 Anaconda3 安装 Tensorflow-gpu &#xff09; GPU 一般是 nvidia 的 安装前 一定 要查看自己电脑的环境配置&#xff0c;然后查询Tensorflow-gpu、Python、 cuda 、 cuDNN 版本关系&…

嵌入式设备显示屏相关概念汇总

嵌入式设备常用的显示屏接口 LCD 接口&#xff1a;是一种常见的数字电路接口&#xff0c;支持多种显示器件&#xff0c;如字符型液晶显示器和点阵型液晶显示器等。 VGA 接口&#xff1a;是一种视频接口标准&#xff0c;用于连接显示器和计算机。该接口提供模拟 RGB 信号&#…