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

【区间dp】-----例题4【凸多边形的划分】

凸多边形的划分

题目描述

给定一个具有 N 个顶点的凸多边形,将顶点从 1 至 N 标号,每个顶点的权值都是一个正整数。
将这个凸多边形划分成 N-2 个互不相交的三角形,求所有这些三角形顶点权值乘积之和的最小值。


输入描述

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

输出描述

输出仅一行,为这些三角形顶点权值乘积和的最小值。


示例

输入

5
121 122 123 245 231

输出

12214884

备注

  • 对于 100% 的数据,有 N ≤ 50
  • 每个顶点的权值均小于 10^9

AC代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lll = __int128;  // 定义 __int128 类型别名,方便使用// __int128 的打印函数:
// 标准库不支持直接打印 __int128,因此需要自定义打印函数
void print128(lll x) {if (x == 0)  // 特判0{cout << '0';return;}if (x < 0)  // 处理负数,先打印负号,再取正{cout << '-';x = -x;}string s = "";// 将数字转换为字符串,取模得到最低位,累加字符while (x > 0) {s += (x % 10 + '0');  // 取个位数字并转成字符x /= 10;              // 去掉个位数字,向高位进位}// 因为是从低位向高位依次加入字符,字符串是反向的,需反转reverse(s.begin(), s.end());cout << s;  // 输出字符串
}int main()
{ll n;cin >> n;  // 输入顶点个数(多边形点数)vector<ll> w(n + 1, 0);  // 权值数组,1-based 索引,w[i] 为第 i 个顶点的权值for (ll i = 1; i <= n; i++){cin >> w[i];}// 定义一个很大的数 N 作为无穷大(INF),用来初始化 DP 表// N = 2^(121),非常大,远大于可能出现的最大代价,防止溢出lll N = 2;for (ll i = 0; i < 120; i++){N *= 2;}// 初始化 DP 数组,dp[i][j] 表示区间 [i,j] 的最小剖分代价// 一开始赋值为无穷大 N,表示暂时不可达或未计算vector<vector<lll>> dp(n + 1, vector<lll>(n + 1, N));// 区间长度为 1 或 2 的子区间不构成三角形,代价为 0// 所以这些区间 dp 值初始化为 0for (ll len = 1; len <= 2; len++){for (ll i = 1; i + len - 1 <= n; i++){ll j = i + len - 1;dp[i][j] = 0;}}// 区间 DP 主要部分:从长度 3 到 n 的区间逐步计算最小代价for (ll len = 3; len <= n; len++){for (ll i = 1; i + len - 1 <= n; i++){ll j = i + len - 1;// 尝试所有可能的中间分割点 k,将区间 [i,j] 分成 [i,k] 和 [k,j]for (ll k = i + 1; k < j; k++){// 代价由三部分组成:// 左子区间最优代价 dp[i][k]// 右子区间最优代价 dp[k][j]// 当前剖分三角形代价 w[i] * w[k] * w[j]lll cost = dp[i][k] + dp[k][j] + (lll)w[i] * w[k] * w[j];// 取所有分割点中的最小代价dp[i][j] = min(dp[i][j], cost);}}}// 打印最终结果,dp[1][n] 即整个多边形的最小剖分代价print128(dp[1][n]);cout << "\n";return 0;
}

————————

详细题解,后续更新

相关文章:

  • 【前端基础】Promise 详解
  • Android Studio 介绍
  • 基于Robust Video Matting 使用Unity 实现无绿幕实时人像抠图
  • 编程日志5.19
  • 人工智能100问☞第33问:什么是计算机视觉?
  • 遥感解译项目Land-Cover-Semantic-Segmentation-PyTorch之三制作训练数据
  • 从无符号长整型数中提取字节
  • 力扣刷题Day 56:岛屿数量(200)
  • 策略模式与责任链模式学习笔记:从入门到理解
  • 如何选择自动化编程平台
  • OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现
  • 【windwos】文本编辑器Notepad++ 替代品Notepad--
  • 支持向量机(SVM)例题
  • 综合实现案例 LVS keepalived mysql 等
  • 深入解析Spring Boot与Redis集成:高效缓存与性能优化实践
  • 《软件工程》第 3 章 -需求工程概论
  • vae 视频截图 复习 gans和vae的原理区别
  • 【通用智能体】Dify API 文件上传功能: 两种传参方式的API传参方式
  • 【Pandas】pandas DataFrame add_prefix
  • window 显示驱动开发-呈现开销改进
  • wordpress4.7添加菜单/百度优化软件
  • 网站备案主体更换/发布软文
  • 深圳集团网站建设企业/百度搜索工具
  • 网站设计制作规范/搜索网站哪个好
  • 什么是动态网站/指数是指什么
  • 重庆十大装饰公司排名/北京seo公司工作