石子合并问题

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

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo

一:任意版
有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为将的一堆石子的数量。设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。
此类问题比较简单,就是哈夫曼编码的变形,用贪心算法即可求得最优解。即每次选两堆最少的,合并成新的一堆,直到只剩一堆为止。证明过程可以参考哈夫曼的证明过程。

二:直线版
在一条直线上摆着N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为将的一堆石子的数量。设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。
如果熟悉矩阵连乘对这类问题肯定非常了解。矩阵连乘每次也是合并相邻两个矩阵(只是计算方式不同)。那么石子合并问题可用矩阵连乘的方法来解决。
那么最优子结构是什么呢?如果有N堆,第一次操作肯定是从n-1个对中选取一对进行合并,第二次从n-2对中选取一对进行合并,以此类推……
设best[i][j]表示i-j合并的最优值, sum[i][j]表示第i堆石子到第j堆石子的总数量,递推公式如下:

 

 

三:圆形版
如果石子是排成圆形,其余条件不变,那么最优值又是什么呢?
因为圆形是首尾相接的,初一想,似乎与直线排列完全成了两个不同的问题。因为每次合并后我们都要考虑最后一个与第一个的合并关系。直线版的矩阵连乘对角线式的最优子结构不见了。f(i, j)表示i-j合并的最优值似乎并不可行,因为我们可以得到的最优值第一步就是第一个与最后一个合并,那么f(i, j)并不能表示这种关系。
修改一下,f(i, j)表示从第i个开始,合并后面j个得到的最优值。sum(i, j)表示从第i个开始直到i+j个的数量和。那么这个问题就得到解决了。注意要把其看成环形,即在有限域内的合并。
递推公式如下:

 

 

上面第二类与第三类的代码复杂度都是O(n^3),n为石子堆数目,那么还有没有复杂度更低的方法呢?有的。也是使用动态规划,由于过程满足平行四边形法则,优化后可以将复杂度降为O(n^2)。下次写四边形优化再写。

动态规划——区间dp [石子合并] 动态规划(dp)是一种通过将问题分解为子问题,并利用已解决的子问题的解来求解原问题的方法。适用于具有重叠子问题和最优子结构性质的优化问题。通过定义状态和状态转移方程,动态规划可以在避免重复计算的同时找到问题的最优解,是一种高效的求解方法,常用于解决各种问题,如最短路径、背包问题、序列比对等。区间dp是一种dp的应用,用于解决涉及区间的问题。它将问题划分为若干个子区间,并通过定义状态和状态转移方程来求解每个子区间的最优解,最终得到整个区间的最优解。 阅读详情

相关推荐

RK3588交叉编译实战:从环境搭建到程序部署

本文详细介绍了在X86主机上为RK3588开发板搭建交叉编译环境的完整流程。从获取ARM工具链、配置sysroot,到实战编译Hello World和Qt应用程序,并提供了部署方法和常见问题解决方案。通过交叉编译,开发者可以在高性能PC上高效开发,并在ARM架构的RK3588上运行程序,大幅提升嵌入式开发效率。

weixin_29191669的博客 274

石子合并系列问题

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

Hoper-J的博客 6025

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

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

动态规划 石子合并问题

m0_52124992的博客 2万+

海外支付实战:虚拟信用卡订阅ChatGPT Plus等服务的完整指南

在跨境数字服务消费中,支付环节常因地区限制、银行风控等因素受阻。其核心原理在于国际信用卡交易需通过发卡行风控系统,而国内银行对高频、小额或商户名非常规的境外线上交易敏感,导致成功率不稳定。为解决这一痛点,虚拟信用卡技术应运而生,它通过服务商生成关联预充值账户的虚拟卡号,提供地域灵活性与资金可控性,显著提升了支付通过率。这项技术的价值在于以较低学习成本,为个人用户打通了访问ChatGPT Plus、Midjourney、Claude Pro等前沿AI服务的支付通道。其典型应用场景包括订阅各类海外SaaS、内容

weixin_42531579的博客 1027

开关电源环路稳定性分析(01)-Buck变换器

这篇文章主要是根据Buck变换器的拓扑结构,利用欧姆定律,基尔霍夫定律,积分微分,这些我们所熟悉的理论推导出了开关电源输入和输出关系的表达式,我相信看完这篇文章,应该是可以自己推导一次。在后面的文章中,我们同样会按照这样的风格,尽量使用大家都已经掌握的知识,来一步一步的拆解晦涩难懂的环路稳定性的问题,在前面先把积木搭起来,后面综合分析的时候就不会显得那么困难!

D_Katter的博客 3835

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

深入对DP的理解,并复习前缀和等常用算法和思想。

Turing_Sheep的博客 2062

最小路径和——动态规划求解(Java实现)

最小路径和——动态规划求解(Java实现) 题目: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 这题和机器人走路的思路类似,就是状态方程有所不同,...

weixin_43395911的博客 895

石子合并问题(no circle)

算法实现题 3-5 石子合并问题(区间DP) 题目描述: 在一个圆形操场的四周摆放着 n 堆石子。现要将石子有次序地合并成一堆。规定每次只 能选相邻的 2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将 n 堆石子合并成一堆的最小得分和最大得分。 编程任务: 对于给定 n 堆石子,编程计算合并成一堆的最小得分和最大得分。 输入样例: 4 4 4 5 9 数据输出:第1行的数是最小得分,第2行中的数是最大得分 输出样例: 43 54 算法分析: 对于动态规划问题首先

半文盲半疯癫重度手机爱好者,世界选社恐大赛第二名。 6962

Camera ITS测试

一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g...

wangubuntu的专栏 7785

FPGA实现串口的任意字节数接收

基于FPGA的任意字节数(单字节、多字节)的串口(UART)接收,真的不来看看吗?

孤独的单刀 1万+

动态规划——石子合并问题

但不同的是,动态规划是自底向上分解,并且会保存子问题的解,在需要时可直接拿过来使用,这一点是区别于分治的。这类问题存在大量重叠子问题,即子问题的解可以被多次重复利用,而这些子问题的结果依赖于更小的子问题结果。子问题划分: 为了找到最优的合并顺序,我们需要考虑如何将区间 [i, j] 划分为更小的子区间 [i, k] 和 [k+1, j],并递归地计算它们的最优解。例如,如果我们有三堆石子 [4, 4, 5],不同的合并顺序会导致不同的得分,总共有两种合并顺序,分别为21和22。

有时候,想要一块二向箔 3956

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1015

石子合并问题总结

直线石子合并 题目链接 时间复杂度:O(n3)O(n3)O(n^3)。 空间复杂度:O(n2)O(n2)O(n^2)。 ∀k∈[l,r),dp[l][r]=mindp[l][k]+dp[k+1][r]+∑i=lra[i]∀k∈[l,r),dp[l][r]=mindp[l][k]+dp[k+1][r]+∑i=lra[i]\forall k \in [l,r),\\ dp[l][r]=\m...

lanadeus 1301

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

dp算法 - 石子合并问题

这两天看了一下这个问题,原题是这样的: 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小(或最大)。 这个题目在第一次刚看的时候,一脸懵逼,题目看懂了,但是怎么去求花费怎么都没有想明白,后来在网上看了一下这个算法的别人的理解,才看明白。 大概意思如下:如果有三堆:4,5,6。 第一种方案...

sunhengzhi_212的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

dp 石子合并问题

石子合并问题: 有n(N 两堆价值之和,求最终将所有的石子合并成一堆之后的代价最小值。 问题一:n堆石子排成一条直线 这个问题比较简单,类似与矩阵连乘的问题。 dp[n][m] 为合并n和m之间的石子的代价 则有dp[i][j] = 0 , i==j dp[n][m] = min(dp[n][k]+dp[k+1][m]) + sum(n,m)  n #include

liuyanfeier的专栏 623

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

(经典问题)—石子合并问题

题目链接:https://www.nowcoder.com/questionTerminal/6d3ccbc5b6ad4f12b8fe4c97eaf969e0 n堆石子摆在一排,每次合成相邻的两堆石子,合成的代价是两堆石子的数量之和。求出代价最少的方案合成所有石子直到只有一堆。 这是动态规划中的经典题目,官话就是找状态转移方程。 我在做动态规划的时候喜欢从后往前思考。 举一个例子,假设石堆...

ACM5100的博客 2180

合并石子问题

我们常见的石子合并问题一般就三种 第一种 n堆石子,每次合并的花费为两堆石子数目之和,求怎样合并可以使得合并为一整堆石子的总花费最少 实际上这就是HUfffman编码的变形,运用贪心策略,每次找出最小的两堆合并即可。 第二种 描述与第一种很相似,只不过每次合并只能合并相邻的两堆石子 那么贪心策略就不一定有用,局部最优的结果不一定是全局最优 那么我们就要考虑了,全局最优的子结构也应当是...

林鹏 2080
上一篇: 样本收集问题
下一篇: 一道有挑战性的题
MasterLuo
博客等级 码龄18年 33粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值