动态规划—区间DP(一)

简介: AcWing算法提高课内容,本文讲解 动态规划

前言

AcWing算法提高课内容,本文讲解 动态规划

本篇包括以下题目:

⭐️ AcWing 1068. 环形石子合并

⭐️ AcWing 320. 能量项链

⭐️ AcWing 479. 加分二叉树

⭐️ AcWing 1069. 凸多边形的划分


写博客有哪里不完善的地方或者有哪里表达错误希望大家提出来,博主会立即改正!望大家海涵


本文需要先自修基础:区间DP


环形石子合并

题目要求

题目描述:

image.png

输入格式:

第一行包含整数 n ,表示共有 n  堆石子。

第二行包含 n 个整数,分别表示每堆石子的数量。

输出格式:

输出共两行:

第一行为合并得分总和最小值,

第二行为合并得分总和最大值。

数据范围:

1n200

输入样例:

4
4 5 9 4

输出样例:

43
54

思路分析

环形的问题我们都可以变环为线,即我们开两倍的大小,然后以n为长度进行枚举即可,下面给一个示例图:

image.png

这样,我们直接对展开的直线以长度为 6 进行遍历,和直接枚举一个环的效果是一致的,为了更快的求出一段区间的和,可以使用前缀和的思维进行优化,前缀和讲解见博客:前缀和算法

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 410;
int f[N][N], g[N][N];
int w[N], s[N];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> w[i], w[i + n] = w[i];
    for (int i = 1; i <= 2 * n; i ++ ) s[i] = s[i - 1] + w[i];
    memset(g, 0x3f, sizeof g);
    for (int i = 1; i <= 2 * n; i ++ ) g[i][i] = 0;
    for (int len = 2; len <= n; len ++ )
        for (int l = 1; l + len - 1 <= 2 * n; l ++ )
        {
            int r = l + len - 1;
            for (int k = l; k < r; k ++ )
            {
                f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
                g[l][r] = min(g[l][r], g[l][k] + g[k + 1][r] + s[r] - s[l - 1]);   
            }
        }
    int maxv = 0, minv = 0x3f3f3f3f;    
    for (int i = 1; i <= n; i ++ )
    {
        maxv = max(maxv, f[i][i + n - 1]);
        minv = min(minv, g[i][i + n - 1]);
    }
    cout << minv << endl << maxv;
    return 0;
}

能量项链

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

输出只有一行,是一个正整数E,为一个最优聚合顺序所释放的总能量。

数据范围:

image.png

输入样例:

4
2 3 5 10

输出样例:

710

思路分析

环形石子合并 的一个升级,思路还是一致的,对应到代码上有一些微处理,比如合并的长度最少是3,区间dp间断点的枚举必须从 l + 1  进行枚举

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
int f[N][N];
int w[N];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> w[i], w[i + n] = w[i];
    for (int len = 3; len <= n + 1; len ++ )
        for (int l = 1; l + len - 1 <= 2 * n; l ++ )
        {
            int r = l + len - 1;
            for (int k = l + 1; k < r; k ++ )
                f[l][r] = max(f[l][r], f[l][k] + f[k][r] + w[l] * w[k] * w[r]);
        }
    int maxv = 0;
    for (int i = 1; i <= n; i ++ ) maxv = max(maxv, f[i][i + n]);
    cout << maxv << endl;
    return 0;
}




目录
相关文章
|
存储 资源调度 安全
H3C CAS系列 一、CAS初认识
对于虚拟化,可能第一时间大家想到的是虚拟机,而对于虚拟机大家可能第一时间想到的就是我们大多数人都可能比较熟悉的VMware系列产品,比如常用VMware Workstation Pro 、VMware esxi。 而今天我带大家一起认识一款我们国产的虚拟化软件 H3C CAS。
2280 0
|
9月前
|
机器学习/深度学习 PyTorch API
MindIE Torch快速上手
MindIE Torch 是一款高效的深度学习推理优化工具,支持 PyTorch 模型在 NPU 上的高性能部署。其核心特性包括:1) 子图与单算子混合执行,配合 torch_npu 实现高效推理;2) 支持 C++ 和 Python 编程语言,灵活适配不同开发需求;3) 兼容多种模式(TorchScript、ExportedProgram、torch.compile),覆盖广泛场景;4) 支持静态与动态 Shape 模型编译,满足多样化输入需求。通过简单易用的 API,开发者可快速完成模型加载、编译优化、推理执行及离线模型导出等全流程操作,显著提升开发效率与性能表现。
|
10月前
|
存储 人工智能 运维
少年云亮相联合国教科文组织,已向偏远地区捐赠200多所AI云教室
少年云亮相联合国教科文组织,已向偏远地区捐赠200多所AI云教室
|
JavaScript
基于Vue2.X/Vue3.X对Monaco Editor在线代码编辑器进行封装与使用
这篇文章介绍了如何在Vue 2.X和Vue 3.X项目中封装和使用Monaco Editor在线代码编辑器,包括安装所需依赖、创建封装组件、在父组件中调用以及处理Vue 3中可能遇到的问题。
3180 1
基于Vue2.X/Vue3.X对Monaco Editor在线代码编辑器进行封装与使用
|
安全 程序员 数据处理
Python运算符详解
Python编程中的运算符包括算术、比较、逻辑、赋值和位运算符。算术运算符如加法(+), 减法(-), 乘法(*), 除法(/), 整除(//)和取模(%)用于数学运算。比较运算符如==, !=, &gt;, &lt;, &gt;=和&lt;=用于比较两个值。逻辑运算符and, or和not用于组合布尔表达式。赋值运算符如=, +=等用于赋值和复合赋值。位运算符如&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、&lt;&lt;(左移)和&gt;&gt;(右移)对整数的二进制位进行操作,常用于底层数据处理和性能优化。
|
SQL 存储 Python
Microsoft SQL Server 编写汉字转拼音函数
Microsoft SQL Server 编写汉字转拼音函数
|
存储 缓存 Linux
入职后,我才明白什么叫Cache
入职后,我才明白什么叫Cache
|
存储 弹性计算 监控
企业邮箱介绍_阿里企业邮箱_阿里邮箱企业版
企业邮箱介绍_阿里企业邮箱_阿里邮箱企业版
1404 2
|
机器学习/深度学习 编解码 自然语言处理
【计算机视觉 | Transformer】arxiv 计算机视觉关于Transformer的学术速递(8 月 9 日论文合集)
【计算机视觉 | Transformer】arxiv 计算机视觉关于Transformer的学术速递(8 月 9 日论文合集)