石子合并(分治+贪心+DP+前缀和)

news2024/9/29 21:34:04

石子合并

  • 一、题目内容
  • 二、思路分析
    • 1、状态转移方程
      • (1)状态表示
      • (2)状态转移
    • 2、循环设计及初始化
      • (1)循环
      • (2)初始化
    • 3、代码实现

一、题目内容

在这里插入图片描述

二、思路分析

这道题也是一个很经典的DP问题。

再次之前我们先回顾一下之前所写的DP文章的解析。我们都是用 i − 1 i-1 i1的规模的子问题来求解我们当前的问题。

其实,有一点类似于贪心的感觉,就是我们不断地做对当下最好的选择。

比如我们之前的背包问题、子序列问题,我们都是看的最后一个元素,我们只做出当下最好的选择,而体现出我们做最好选择的部分就是我们通过比较选出最大值最小值的代码。

但是这道题不一样,这道题将带给我们新的理解。

如果说我们之前的问题是贪心+DP,那么我们今天的问题就是分治+贪心+DP

其中DP决定了我们这道题的框架,而前面的算法决定了我们书写状态转移方程的依据。

1、状态转移方程

(1)状态表示

状态表示通常来源于问题,问题中的变量通常代表了状态的规模。

我们这道题用 f ( i , j ) f(i,j) f(i,j)来表示合并区间 [ i , j ] [i,j] [i,j]的石子所需要的最少的代价。

(2)状态转移

状态转移我们这里要使用分治的思想。

这里使用的分治类似于我们的快速排序。

如下图所示:

在这里插入图片描述

图中的黑线表示合并两大堆石子的最优选择

那么我们怎么知道这个黑线的位置呢?我们只需要去枚举比较出最优即可。

当我们做出了最优选择后,我们需要对每一小堆做同样的操作。

接下来我们就可以去写一下状态方程的表示了:

f ( i , j ) = m a x ( f ( i , k ) + f ( k + 1 , j ) + S [ i ] [ j ] , f ( i , j ) ) f(i,j)=max\big(f(i,k)+f(k+1,j)+S[i][j],f(i,j)\big) f(i,j)=max(f(i,k)+f(k+1,j)+S[i][j],f(i,j))
我们来解释一下,这个 k k k就是我们所有可能合并两堆石子的位置。

我们合并两堆石子,必定需要加上两堆的石子数目作为代价。即我们的 S [ i ] [ j ] S[i][j] S[i][j]

2、循环设计及初始化

(1)循环

循环一定是从最小的子问题开始的,我们最小的子问题就是合并真正意义上的两堆石子,即区间长度是2。因此,我们要枚举出所有可能合并的情况。

那么我们的外循环 i i i负责区间的长度,内循环负责所有区间长度为 i i i的情况,并计算出代价。

(2)初始化

初始化从现在开始是一个非常重要的环节,之前的背包问题等好多问题也涉及到了初始化的问题,但是由于我们的 f 数组是全局变量,因此就都初始化为0,而那些问题恰好也是初始化为0的。所以我们就没有提。

今天的问题或许也是初始化为0,但是我们需要注意一下初始化的问题,那么涉及到初始化的一定是最小的子问题。

我们发现,我们的最小问题的长度为2的子序列。那长度为1的呢?长度为1就说明我们就这一堆石子。我们无需花费任何代价,因此我们需要将所有的 f [ 1 ] [ j ] f[1][j] f[1][j]初始化为0。

但是由于全局变量的原因,我们可以不写,但是不写不代表我们不用思考初始化。

3、代码实现

由于最终我们会加上某段区间所有石子的代价,所以我们这里使用前缀和优化一下。

#include<iostream>
using namespace std;
const int N=310;
int f[N][N];
int s[N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        s[i]=x+s[i-1];
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j+i-1<=n;j++)
        {
            int l=j,r=j+i-1;
            f[l][r]=0x3f3f3f3f;
            for(int k=l;k<r;k++)
            {
                f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
            }
        }
    }
    cout<<f[1][n]<<endl;
    return 0;
}

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

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

相关文章

灵感来源于宇宙光束 长安汽车发布全新设计理念

12月28日&#xff0c;“重构想象 创领未来”2022首届长安汽车设计日正式启幕&#xff0c;长安汽车副总裁王孝飞发表“以创新之手、触万象之境”的主题演讲&#xff0c;分享了最新设计理念&#xff0c;正式发布长安汽车全新设计理念“纵横万象”。同时&#xff0c;基于这一理念打…

【Docker社区大会】WebAssembly:无需容器的 Docker——VMware技术总监 Daniel Lopez

本文授权翻译自 Wasm Labs VMware OCTO 的 blog&#xff1a; WebAssembly: Docker without container。这是 Wasm Labs 在 2022 年 12 月 15 日在冬季Docker Community All Hands 7 的关于 DockerWebAssembly 的演讲的文字版。 作者&#xff1a;Asen Alexandrov&#xff0c;Wa…

C#,图像二值化(08)——全局阈值优化算法及其源代码

1、全局阈值算法 基于灰度直方图的优化迭代算法之一。 Iterative Scheduler and Modified Iterative Water-Filling In the downlink, the inter-cell interference is only function of the power levels and is independent of the user scheduling decisions. This suggest…

【全网最细PAT题解】【PAT乙】1005 继续(3n+1)猜想(map和vector的运用)

题目链接 1005 继续(3n1)猜想 题目描述 1005 继续(3n1)猜想 分数 25 作者 CHEN, Yue 单位 浙江大学 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递…

Linux网络收包过程

一、Linux 网络收包总览 在 TCP / IP 网络分层模型里&#xff0c;整个协议栈被分成了物理层、链路层、网络层&#xff0c;传输层和应用层。物理层对应的是网卡和网线&#xff0c;应用层对应的是我们常见的 Nginx&#xff0c;FTP 等等各种应用。Linux 实现的是链路层、网络层和…

scaner从外网到内网域渗透笔记

scaner 从外网到内网域渗透 1.环境配置 1.1靶场信息 用到的虚拟机共有三个 分别是 12server-db 、12-dc 、web1 12server-db、web1 这两个可以使用桥接或者nat模式根据需求可以设置 网卡1 12-dc用的是VMnet 19 这台机子已经绑定ip 主机名ip账号和密码web1192.168.0.160we…

工具(三):Jmeter压测数据在Grafana展示

Docker 安装 InfluxDBJMeter 配置 InfluxDB数据源Grafana 配置influxdb数据源 Docker 安装 InfluxDB docker pull influxdb:1.8.6 # 拉取influxdb镜像docker run -d -p 8086:8086 --namejmeterdb influxdb:1.8.6 # 启动influxdb&#xff0c;并命名为jmeterdbdocker exec -it …

使用Canvas实现封装路径,添加颜色,实现渐变,3d特效

目录 1.封装路径 2.添加颜色 3.渐变特效 3.1线性渐变 3.2径向渐变 3.3径向渐变模拟3d球 图形我们已经会绘制了&#xff0c;但是单一的图形肯定不好看&#xff0c;就像html没了css一样&#xff0c;所以今天我们要把图形上色。 1.封装路径 new Path2D()进行封装&#x…

NAPI简介

NAPI简介 它的核心概念就是不采用中断的方式读取数据&#xff0c;而代之以首先采用中断唤醒数据接收的服务程序&#xff0c;然后 POLL 的方法来轮询数据。NAPI是综合中断方式与轮询方式的技术。 中断的好处是响应及时&#xff0c;如果数据量较小&#xff0c;则不会占用太多的…

百度发布Apollo 8.0,架构、能力双双升级

12月28日&#xff0c;百度举行了Apollo开放平台8.0线上发布会。会上&#xff0c;百度正式推出Apollo开放平台8.0&#xff0c;进一步夯实了平台的易用性&#xff0c;让开发者操作更简单易上手。同时&#xff0c;百度Apollo也面向外界分享了在自动驾驶教育、生态合作伙伴等方面的…

SuperMap GIS基础软件中数据库使用指南

作者&#xff1a;Carlo 一、支持的主流数据库类型 1、主流数据库介绍 数据库名称版本不支持的数据集类型需要配置 客户端支持工作空间支持集群模式SQLPlus2008/2012/2016/2018&#xff08;仅 Windows 平台支持&#xff09;视频、复合点、复合线、复合面、复合文本数据集是是是…

球王贝利去世终年 82 岁,其是世界上唯一三次夺取世界杯冠军的足球运动员,如何评价他的传奇一生?

当地时间12月29日&#xff0c;巴西圣保罗市阿尔伯特爱因斯坦医院发布公告称&#xff0c;巴西知名运动员、“球王”贝利因结肠癌引发多器官衰竭&#xff0c;于当天15时27分去世&#xff0c;终年82岁。贝利女儿凯丽纳西门托在社交媒体发文&#xff1a;“我们的一切都归功于你&…

VR餐厅全新思路,可以为餐饮行业带来哪些好处?

餐饮行业的寒冬即将过去&#xff0c;逐渐迎来了发展的好机会&#xff0c;趁此机遇你会怎么做呢&#xff1f;餐饮行业的竞争依旧激烈&#xff0c;也许你的餐厅占据了很好的地理位置&#xff0c;或者是拥有时尚有品位的装修风格&#xff0c;亦或者拥有美味可口的菜品&#xff0c;…

报表开发工具FastReport.NET的五大常见问题及解决方法

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载&#xff08;qun&#x…

黑马Hive+Spark离线数仓工业项目--数仓主题应用层ST层构建(1)

数仓主题应用层ST层构建 1. 构建ST层&#xff1a;数据应用层 掌握每个主题的聚合指标和聚合的维度 - 工单主题 - 油站主题 - 回访主题 - 安装主题 - 费用主题2. DM层的设计 - 运营部门需要的数据抽取 数仓分层回顾 目标&#xff1a;回顾一站制造项目分层设…

使用命令设置Windows音量和音频输出设备

前言 Windows似乎并没有音量设置的命令&#xff0c;也没有输出设备的设置命令。如果你知道&#xff0c;请告诉我一下~ 因此&#xff0c;这里使用了一个神级小工具&#xff1a;nircmd 官网下载地址&#xff1a; 32位&#xff1a;http://www.nirsoft.net/utils/nircmd.zip 64…

2023年网络安全工程师面试题合集【首发】

以下为信息安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作~ 【一一帮助安全学习【点我】一一】①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④50 份安全攻防面试指南⑤安全红队渗透工具包⑥网络安…

Mathorcup数学建模竞赛第五届-【妈妈杯】D题:图像去噪中几类稀疏变换的矩阵表示(附一等奖获奖论文和matlab代码实现)

赛题描述 假设一幅二维灰度图像 X 受到加性噪声的干扰:Y=X+N ,Y 为观察到的噪声图像, N 为噪声。通过对于图像 Y 进行稀疏表示可以达到去除噪声的目的。任务: 2. 利用 Cameraman 图像中的一个小图像块(见图 1)进行验证。 3. 分析稀疏系数矩阵,比较四种方法的硬阈值稀…

类和对象(中)

原文再续&#xff0c;书接上回&#xff01;&#xff01; 继续类和对象的学习。 目录 构造函数 析构函数 拷贝构造 赋值重载 运算符重载 const成员 取地址及const取地址操作符重载 当我们没有向类中写入任何成员的时候&#xff08;也就是空类&#xff09;&#xff0c;类中…

【每日一题Day72】LC855考场就座 | 构造数据结构 动态数组+二分查找

考场就座【LC855】 There is an exam room with n seats in a single row labeled from 0 to n - 1. When a student enters the room, they must sit in the seat that maximizes the distance to the closest person. If there are multiple such seats, they sit in the sea…