C++---区间DP---环形石子合并(每日一道算法2023.4.24)

news2024/10/5 22:23:30

注意事项:
本题是"区间dp—石子合并"的扩展题,dp思路完全一样,就不多详细讲了,可以去那篇文章看,这题主要讲一下如何处理环形。

题目:
将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。
规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。

请编写一个程序,读入堆数 n 及每堆的石子数,并进行如下计算:

  • 选择一种合并石子的方案,使得做 n−1 次合并得分总和最大。
  • 选择一种合并石子的方案,使得做 n−1 次合并得分总和最小。

输入格式
第一行包含整数 n,表示共有 n 堆石子。
第二行包含 n 个整数,分别表示每堆石子的数量。

输出格式
输出共两行:
第一行为合并得分总和最小值,
第二行为合并得分总和最大值。

数据范围
1≤n≤200

输入:
4
1 3 5 2
输出:
22
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 410, INF = 0x3f3f3f;      //N开两倍
int n, m, s[N], w[N];        //s存储前缀和,w存储原始值
int f[N][N], g[N][N];    //f存储max,g存储min

int main() {
    cin >> n;
    for (int i = 1; i<=n; i++) {        //读入数组,并将数组复制一遍接到尾部,比如123,变为123123
        cin >> m;
        w[i] = w[i+n] = m;
    }

    //前缀和处理
    for (int i = 1; i <= n*2; i++) s[i] = s[i-1] + w[i];

    //dp(和基础版石子合并完全相同,只不过同时求了max和min)
    memset(f, -INF, sizeof f);  //f求max,所以初始为负无穷
    memset(g, INF, sizeof g);   //同理
    for (int len = 1; len <= n; len++) {                //枚举
        for (int i = 1; i+len-1 <= (n*2); i++) {
            int l = i, r = i+len-1;
            if (len == 1) {
                f[l][r] = g[l][r] = 0; continue;
            }
            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 = -INF, minv = INF;
    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 << endl;

    return 0;
}

思路:
处理环形其实非常简单,举个例子吧,比如我们当前的数组是1到8:
请添加图片描述
每条边代表一次合并,最终会有n-1次合并,并存在一个缺口,
同时可以发现,缺口所在的位置,就代表存在的一种合并方案,
那么枚举所有缺口,也就是计算出了所有的方案。

但按照常规枚举肯定是不行的,
因为本身石子合并就已经是n^3的时间复杂度了,
再枚举n个缺口,就是n^4,肯定会超时,那么就需要用到环形优化,
即,将链复制一份接在尾部,并对这个链进行dp即可:
请添加图片描述

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

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

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

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

相关文章

ES的索引结构与算法解析

作者&#xff1a;京东物流 李洪吉 提到ES&#xff0c;大多数爱好者想到的都是搜索引擎&#xff0c;但是明确一点&#xff0c;ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎&#xff0c;还是有明确搜…

DAY03_循环语句

1&#xff1a;for循环结构 来&#xff0c;继续啊&#xff0c;下面我们来学习循环结构语句&#xff0c;循环结构有三种语句&#xff0c;分别是&#xff1a; for循环 while循环 do…while循环 这三种循环可以做相同的事情&#xff0c;当然它们也有小的区别&#xff0c;至于它…

【LeetCode】322. 零钱兑换

322. 零钱兑换&#xff08;中等&#xff09; 思路 由于题目提到 「每种硬币的数量是无限的」&#xff0c;所以这道题本质上完全背包问题&#xff0c;我直接使用了空间压缩的写法。dp[j] 表示当前区间在 [0, i]的硬币可以表示成 j 的最小数量。注意&#xff0c;这里把 dp数组初始…

windows安装sqli-labs靶场,两种方式

1、安装phpstudy 官网打不开了&#xff0c;下载地址在这儿https://download.csdn.net/download/weixin_59679023/87711536 双击安装 点自定义安装&#xff0c;选择安装目录&#xff0c;注意目录不要有空格和中文 安装完成启动红框内的两个服务 2、安装sqli靶场 这个包支持ph…

4.23学习周报

文章目录 前言文献阅读摘要简介方法结果结论 时间序列预测学习总结 前言 本周阅读文献《A novel hybrid model for water quality prediction based on synchrosqueezed wavelet transform technique and improved long short-term memory》&#xff0c;文献主要提出一种新型混…

动力节点Springsecurity笔记06-13基于数据库的方法授权

6 密码处理 6.1 为什么要加密&#xff1f; csdn 密码泄露事件 泄露事件经过&#xff1a;https://www.williamlong.info/archives/2933.html 泄露数据分析&#xff1a;https://blog.csdn.net/crazyhacking/article/details/10443849 6.2加密方案 密码加密一般使用散列函数&a…

react-9 函数式写法rsc,配合HOOKS基础钩子函数

函数组件和类组件区别&#xff1a; 1.函数组件中没有this 2.函数组件无需继承 3.函数组件默认没有状态&#xff0c;想要使用组件状态必须通过 HOOK 函数引入 4.函数组件默认没有生命周期函数 5.函数组件的渲染&#xff0c;只需要一次函数调用即可 useState &#xff1a;用…

【react全家桶学习】react中JSX语法规则

目录 JSX的定义 XML的含义 JSX的语法规则 &#xff08;1&#xff09;定义类名&#xff0c;用className而不是class &#xff08;2&#xff09;如何使用内联样式设置样式 &#xff08;3&#xff09;虚拟dom必须只有一个根标签 &#xff08;4&#xff09;在react组件中使用变…

谷歌将发布全新搜索引擎,你期待吗?

Google一身自带AI属性的新搜索最首要的目标并非急于取代传统搜索引擎&#xff0c;或者说彻底打败ChatGPT&#xff0c;而是能够用全新的产品说服用户&#xff0c;变得与竞争对手同样“强大、能力出众以及顺应AI潮流”。 对于Google而言&#xff0c;搜索就是命脉。Google每年的收…

Java基础——多线程创建

&#xff08;1&#xff09;什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。程序中只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 &#xff08;2&#xff09;多线程是什么&#xff1f; 多线程是指从软硬件上实现多执行流程的技术。 &…

Python入门教程+项目实战-10.5节: 程序实战-冒泡排序算法

目录 10.5.1 排序算法简介 10.5.2 冒泡排序算法 10.5.3 系统学习python 10.5.1 排序算法简介 所谓排序&#xff0c;是指将数据集合中的元素按从小到大的顺序进行排列&#xff0c;或按从大到小的顺序进行排列。前者称为升序排序&#xff0c;后者称为降序排序。在数据结构与算…

jenkins自动化部署配置

文章目录 1. jenkins 插件安装2. 配置2.1 全局工具配置2.2 全局配置2.2.1 gitee 配置 3. 创建任务添加gitee ssh jenkins 开机自启动 1. jenkins 插件安装 ant Build Failure AnalyzerBuild Monitor ViewBuild Timeout dockerEmail Extension Plugin giteegithubgradle javama…

【11 EL表达式JSTL 学习笔记 】

EL表达式 学习笔记 1. EL表达式介绍2. EL表达式的基本使用3. EL 表达式获取数据4. EL注意事项5. EL表达式运算符关系运算符逻辑运算符empty&三元运算符 6. EL表达式细节7. EL表达式11个隐式对象8. JSTL8.1 JSTL的基本使用 1. EL表达式介绍 简化了 java代码块和jsp表达式的…

ChatGPT的开源平替,终于来了!

最近这段时间&#xff0c;一个号称全球最大ChatGPT开源平替项目Open Assistant引起了大家的注意。 这不最近还登上了GitHub的Trending热榜。 https://github.com/LAION-AI/Open-Assistant 根据官方的介绍&#xff0c;Open Assistant也是一个对话式的大型语言模型项目&#xff…

RUST 每日一省:生命周期作用域

生命周期 一个变量的生命周期就是它从创建到销毁的整个过程。 作用域 我们声明的每个变量都有作用域。作用域其实是变量和值存在的环境。作用域是由一对花括号表示的。例如&#xff0c;使用块表达式会创建一个作用域&#xff0c;即任何以花括号开头和结尾的表达式。此…

RabbitMQ-整合mqtt

用 springboot rabbitmq可以搭建物联网&#xff08;IOT&#xff09;平台&#xff0c;rabbitmq 不是消息队列吗&#xff0c;原来rabbitmq有两种协议&#xff0c;消息队列是用的AMQP协议&#xff0c;而用在智能硬件中的是MQTT协议。 一、rabbitmq是什么&#xff1f; RabbitMQ就…

一张图了解GPU、CUDA、CUDA toolkit和pytorch的关系

文章目录 GPU、Cuda Driver和 Cuda Toolkit的图解关系省流&#xff0c;简略版本要实现多版本的cuda怎么办 复杂版&#xff08;你要是觉得简略版说的太简单&#xff0c;这里给你找文档证明&#xff09;一、Nvidia Driver和CUDA Toolkit的关系安装GPU显卡驱动Nvidia Driver 二、C…

uniapp请求图片时候发现提示GET http://localhost:xxxx/undefined 401,undefined:1解决办法【伸手党福利】

同理解决问题&#xff1a;所有请求发起完成之后执行业务逻辑 目录 现象原因解决办法方法1&#xff1a;提前给变量一个非空默认值方法2&#xff1a;使用前端图片代替后端方法3&#xff1a;使用异步加载判断&#xff1a;注意&#xff1a;这种直接在页面判断内容是否为空或者undef…

Java JVM基础入门(一):jvm的组成、串池、常量池、常用程序调优参数

JVM JVM是java的虚拟机&#xff0c;java的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能 JDK、JRE、JVM的关系图 常见的JVM&#xff1a; oracle的Hotspot是我们通常使…

矿山电子封条智能监管算法 yolov8

矿山电子封条智能监管系统通过YOLOv8python网络模型技术&#xff0c;矿山电子封条智能监管算法模型在对矿井人数变化、生产作业状态、出入井人员等情况实时监测分析&#xff0c;发现煤矿人员作业及状态异常动态及时告警&#xff0c;自动将报警信息推送给后台。YOLOv8 算法的核心…