环形石子合并问题(动态规划)(洛谷P1880)

动态规划石子合并问题 问题描述:在一个圆形操场的四周摆放着n堆石子,现要将石子有次序的合并成一堆。每次只能选择相邻的2堆石子合并成新的一堆,并将新的一对石子数记为该次合并的得分。 求 最小值和最大值 in: 4 4 4 5 9out: 43 541.首先考虑 石子是环形摆放 所以可以 将数组存放成 4 4 5 9 4 4 5 2.然后从局部最优求到全局最优其中采用2个数组来储存 运算过程用到的数据 阅读详情

                    环形石子合并问题(动态规划)

传统的石子合并问题为:有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量,求将这N堆石子合并成一堆的总花费最小(或最大)。

这类问题类似区间DP的解法,设dp[i][j]为合并从i到j的最小总花费,那么预处理出前缀和,转移方程为dp[i][j]=max(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]),且i==j时dp[i][j]=0;核心代码为:

    for(int v = 1; v < n; v++)
    {
        for(int i = 0;i < n-v; i++)
        {
            int j = i + v;
            dp[i][j] = INF;
            int tmp = sum[j] - (i > 0 ? sum[i-1]:0);
            for(int k = i; k < j; k++)
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + tmp);
        }
    }

环形石子合并问题为洛谷P1880

题目描述

在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出格式:

输出共2行,第1行为最小得分,第2行为最大得分.

输入输出样例

输入样例#1: 
4
4 5 9 4
输出样例#1: 
43
54





题解:对于环形的处理典型的方法是将环拆成链,也就是将长度扩大2倍,求链的最佳得分可以通过反向枚举左端点,然后找到当前到右端点的最佳,因为链的长度为原来的两倍,所以应该从2*n-1枚举,每次枚举n的长度,然后从1-n找最后的答案即可。

AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
#define _for(i,a,b) for(int i=a;i<=b;i++)
const int maxn = 507;
const int inf = 0x3f3f3f;
int n,m,a[maxn],sum[maxn],dp_max[maxn][maxn],dp_min[maxn][maxn];
int main(int argc, char const *argv[])
{
    cin>>n;
    _for(i,1,n)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    _for(i,n+1,n*2)
    {
        a[i]=a[i-n];
        sum[i]=sum[i-1]+a[i];
    }
    for(int i=n*2-1;i>0;i--)
    {
        _for(j,i+1,i+n)
        {   
            dp_min[i][j]=inf;
            _for(k,i,j-1)
            {
                dp_min[i][j]=min(dp_min[i][j],dp_min[i][k]+dp_min[k+1][j]+sum[j]-sum[i-1]);
                dp_max[i][j]=max(dp_max[i][j],dp_max[i][k]+dp_max[k+1][j]+sum[j]-sum[i-1]);
            }
        }
    }
    int ans_min = inf;
    int ans_max = 0;
    _for(i,1,n)
    {
        ans_max=max(dp_max[i][i+n-1],ans_max);
        ans_min=min(dp_min[i][i+n-1],ans_min);
    }
    cout<<ans_min<<endl;
    cout<<ans_max<<endl;
    return 0;
}

题解:洛谷 P1880 [NOI1995] 石子合并 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的。堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出一个算法,计算出将。在一个圆形操场的四周摆放。堆的最小得分和最大得分。#普及+# #区间DP#本文分享的必刷题目是从。 阅读详情

相关推荐

YOLOv11 网络结构详解:一文看懂 Backbone、Head、C3k2、SPPF 和 Detect 检测头

在使用 YOLOv11 进行目标检测时,我们经常会接触到或这样的模型配置文件。backbone和head分别是什么意思?ConvC3k2SPPFC2PSA这些模块分别起什么作用?P3/8、P4/16、P5/32 代表什么?为什么最后 Detect 要同时接收 3 个不同尺度的特征图?YOLOv11n、YOLOv11s、YOLOv11m、YOLOv11l、YOLOv11x 的区别在哪里?

learnerYC的博客 1812

环形石子合并【详解区间DP】

加油!

m0_63613132的博客 1089

告别TI官网迷路!手把手教你用C2000Ware为TMS320F28027搭建Proteus仿真工程模板

本文详细指导如何使用C2000Ware为TMS320F28027搭建Proteus仿真工程模板,帮助DSP开发者快速上手。从资源获取、工程目录设计到关键文件配置,再到CCS与Proteus的联调技巧,全面解析仿真工程搭建的每个步骤,特别适合初学者和工程师参考。

weixin_42715608的博客 473

环形石子合并问题

环形石子合并问题是在普通的相邻石子合并问题的基础上稍加拓展,石子变成了环形的,也就是说每个石子都可能和其左右两边的石子合并。 那么它的dp解法也是基于普通的相邻石子合并问题,不了解的同学可以参考我写过的这篇文章。 有两种解法,但他们基本的算法思想是一样的。 第一种是和上面链接文章的写法类似,不同的是对于需要绕圈的点,普通的相邻石子合并问题是直接跳过(因为它无法到达),而对于环形的,有两种...

姬小野的博客 4497

内存管理(二)——内存分段

内存分段

weixin_43844995的博客 2693

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 611

石子合并问题(动态规划)

动态规划 石子合并问题

m0_52124992的博客 2万+

2025年5月架构设计师论文真题回顾,附写作技巧、所涉知识点及参考范文(三)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试下午论文的题目,同时附带写作技巧、所涉知识点及参考范文。试题三:多模型数据库及应用。

一几文的编程学习笔记。 630

环形石子合并(区间DP)

环形石子合并(区间DP) 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。输入格式第一行包含整数 n,表示共有 n 堆石子。第二行包含 n 个整数,分别表示每堆石子的数量。输出格式输出共两行:第一行为合并得分总和最小值,第二行为合并得分总和最大值。数据范围1≤n≤20044 5 9 44354。

qq_59183443的博客 882

PCL 三维重建 基于B样条曲线的曲面重建算法

本文将介绍如何使用B样条曲线进行三维点云数据的曲面重建。B样条曲线和曲面是一种强大的数学工具,在计算机图形学、CAD设计等领域中广泛应用。通过对点云数据进行曲面拟合和优化,最终得到精确的曲面模型。本示例展示了如何利用PCL中的B样条曲线拟合算法进行三维曲面重建,并对重建结果进行可视化。

纵马踏花向自由 658

深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)

最近在学习《强化学习原理与Python实现》,肖智清著。参考第十二章的自动驾驶案例,写一篇总结,尽量做到简单可行,让有志于自动驾驶的小伙伴可以通过此篇博客可以管中窥豹,初步了解自动驾驶的强化学习训练过程。 本篇将自动驾驶问题转化为回合制的强化学习任务,设计以车辆观察图像和运行状态为输入的自动驾驶算法,并在AirSim仿真环境中进行训练和测试。本篇使用带经验回放和目标网络的基于深度Q网络算法设计并实现智能体,对经验回放、目标网络和深度Q学习算法进行简单介绍,并用代码实现。

shao918516的博客 8599

环形石子合并问题及四边形不等式优化

环形区间DP本质上还是求解链形区间DP,只是一个有n个节点的环可以拆分成n个不同的链。如果分别计算每个链的结果,那么本题一定会超时。优化策略:将一个链复制一份并连接在其尾部,形成一个2n个节点的“长链”。上述n条不同的链都能在该“长链”中找到。枚举len的时候只需要枚举到len = n即可。对于较小的n,我们还是可以采用DP朴素O(n^3)来做。 假设圆形石子长度为n,基于动态规划的问题求解,可以采用集合的方式求解,区间DP问题一般采用二维空间计算。对于问题需要求最大...

weixin_57309693的博客 376

Vue+Echarts监控大屏实例四:智慧农业监控模板实例

本实例通过Vue-Echarts实现了智慧农业监控模板实例界面,学习并使用了vue-echarts的使用,接入高德地图并展示,添加了全屏切换、加载动画小鼓、站点切换及退出等相关功能,提供源码下载。

Java、前端、小程序学习笔记、问题汇总、项目实例分享,有需要请联系。 7667

P1880 [NOI1995] 石子合并

P1880 [NOI1995] 石子合并

青少年趣味编程 1132

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

石子合并系列问题

动态规划中的石子合并系列问题 设有N堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。找出一种合理的方法,使总的代价最小,输出最小代价。将N堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数记为该次合并的得分。

Hoper-J的博客 6025

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

洛谷P1880 [NOI1995] 石子合并题解

在一个环形区域内摆n堆石子,每次任意合并相邻的两堆,每次会得到分数第一堆石子的数量第二堆石子的数量。求最大最小分数值。

小冻梨的博客 1265

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

信息学奥赛一本通 1569:【 例 1】石子合并 | 洛谷 P1880 [NOI1995] 石子合并

摘要:该题目解决环形石子合并问题,采用区间动态规划与破环为链的方法。将环形序列转化为2n-1的线性序列后,使用前缀和数组优化计算。定义dpMin和dpMax分别表示区间合并的最小和最大得分,通过枚举分割点进行状态转移。最终结果由所有长为n的区间中的最值确定,时间复杂度为O(n³)。代码实现了这一思路,求出了环形石子合并的最小和最大得分。

君义NOIP的博客 1230

洛谷 P1880 [NOI1995] 石子合并 题解

洛谷 P1880 [NOI1995] 石子合并 题解

mkx2023275的博客 1006

Luogu 1880 合并石子

Luogu 1880 合并石子 (线性动态规划) 这是一道经典的区间型动态规划,但对于初学dp仍然思考了很久。 —————————————————————————————————— 题干:https://www.luogu.org/problem/P1880 题目描述: 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记...

October の 补题记录 1446

石子合并问题

石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小(或最大)。 分析:当然这种情况是最简单的情况,合并的是任意两堆,直接贪心即可,每次选择最小的两堆合并。本问题实际上就是哈夫曼的变形。 (2)有N堆

ACdreamer 5万+

经典DP 洛谷p1880 石子合并

https://www.luogu.org/problemnew/show/P1880题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤10...

weixin_34247155的博客 124

P1775 石子合并(弱化版)及 P1880 [NOI1995] 石子合并 【题解】

本文介绍了石子合并问题的两种动态规划解法。P1775问题使用区间DP策略,将线性排列的石子堆合并为一堆,通过状态转移方程计算最小代价。P1880问题则扩展为环形排列,通过拆环为链的方法,同时计算最小和最大合并代价。两个问题都利用前缀和优化区间和计算,时间复杂度为O(n^3)。代码实现展示了如何通过动态规划高效解决这类合并优化问题。

cyx20091026的博客 691

P1880 [NOI1995]石子合并 (区间DP)

  P1880 [NOI1995]石子合并   题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式:   数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表...

大芝士球的博客 1499

P1880 [NOI1995] 石子合并------动态规划(区间dp)

这题讲的就是环形石子合并,我们只要把石子数组复制一份接到末尾,形成一个2N的数列,就可以模拟环形啦,虽然此时长度变长了,但是我们只要枚举出长度为N的区间最优得分就OK了。在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。第 2 行有 N 个整数,第 i 个整数 ai​ 表示第 i 堆石子的个数。

m0_74995784的博客 1376

洛谷P1880 [NOI1995]石子合并【动态规划】

题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式:   数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.   输出格式:   输出共...

独钓门前月 534
上一篇: [Tyvj Jan]楼兰图腾(树状数组)
下一篇: AtCoder Beginner Contest 096题解
sortmin
博客等级 码龄9年 45粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值