热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

四边形不等式优化石子合并

关于四边形不等式或石子合并的资料。网上有很多。但有不少都是语焉不详,直接抛给你几个结论,让人很难理解。这篇文章将以石子合并为例。证明关于四边形不等式的一些结论。算是一个温习。【题面】在一个

关于四边形不等式或石子合并的资料。网上有很多。但有不少都是语焉不详,直接抛给你几个结论,让人很难理解。这篇文章将以石子合并为例。证明关于四边形不等式的一些结论。算是一个温习。

【题面】

      在一个操场上摆放着一排n(n≤20)堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

试编程求出将n堆石子合并成一堆的最小得分和最大得分以及相应的合并方案。

【算法分析】

         下面只讨论最小得分的情况,最大得分的情况类似。

         设

f[I,j]=min{f[I,k]+f[k+1,j]+w[I,j]}{i<=k

         很明显,这是一个O(n^3)的动规

【算法优化】

         下面是重头戏。

         首先给出两个定义:

         (1)当函数w[i,j]满足w[i,j]+w[i',j']<=w[i',j]+w[i,j'],i<=i'<=j<=j'时,称w满足四边形不等式。

         (2)当函数w[i,j]满足w[i’,j]≤w[i,j’],i<=i'<=j<=j' 时称w关于区间包含关系单调。

       很明显的,一开始定义的w[I,j]满足区间包含关系和四边形不等式。

        现在我们要证明f[I,j]=min{f[I,k]+f[k+1,j]+w[I,j]}{i<=k

        我们利用数学归纳法对四边形不等式中的区间长度进行归纳。

证明如下:

      当i=i’或j=j’时,不等式显然成立。由此可知,当l≤1时,函数f满足四边形不等式。

      下面分两种情形进行归纳证明:

      情形1:i

      在这种情形下,四边形不等式简化为如下的不等式:f[i,j]+f[j,j’] ≤f[i,j’]+0,设k=max{p| f[i,j’]=f[i,p-1]+f[p,j’]+w[i,j’] },再分两种情形k≤j或k>j。下面只讨论k≤j,k>j的情况是类似的。

      情形1.1:k≤j,此时:

      情形1.2:k>j,略去

      情形2:i

      设 y=max{p | f[i’,j]=f[i’,p-1]+f[p,j]+w[i’,j] }

        z=max{p | f[i,j’]=f[i,p-1]+f[p,j’]+w[i,j’] }

       仍需再分两种情形讨论,即z≤y或z>y。下面只讨论z≤y,z>y的情况是类似的。

       情形2.1,i

        显然的,我们有:

         f[i,j]+f[i',j']<=w[i,j]+f[i,z-1]+f[z,j]+w[i',j']+f[i',y-1]+f[y,j']

        因为w满足四边形不等式,所以:

        f[i,j]+f[i',j']<=w[i,j']+w[i',j]+f[i',y-1]+f[i,z-1]+f[z,j]+f[y,j']

        因为f[i,j']+f[i',j]=w[i,j']+w[i',j]+f[i',y-1]+f[i,z-1]+f[y,j]+f[z,j']

        所以,要证f[i,j']+f[i'j]>=f[i,j]+f[i',j'],就要证f[z,j]+f[y,j']<=f[y,j]+f[z,j']。

        因为i

        情形2.1,i

        综上所述,f[i,j]满足四边形不等式。

         事实上,对于任意f[I,j]=max{f[I,k]+f[k+1,j]+w[I,j]}{i<=k

         前面千辛万苦证明了f满足四边形不等式,那么它有什么用呢?

         之所以要证明四边形不等式,就是为了证明f满足决策单调性,即:

                        s[i,j-1]≤s[i,j]≤s[i+1,j],     i≤j

         其中,s[I,j]为区间[I,j]上的最优决策。

         当i=j时,单调性显然成立。因此下面只讨论i

         令fk[i,j]=f[i,k-1]+f[k,j]+w[i,j]。要证明s[i,j]≤s[i,j+1],只要证明对于所有ik’[i,j]≤fk[i,j],有:fk’[i,j+1]≤fk[i,j+1]。

         事实上,我们可以证明一个更强的不等式

fk[i,j]-fk’[i,j]≤fk[i,j+1]-fk[i,j+1]

         也就是:          fk[i,j]+fk’[i,j+1]≤fk[i,j+1]+fk’[i,j]

         利用递推定义式将其展开整理可得:f[k,j]+f[k’,j+1]≤f[k’,j]+f[k,j+1],这正是k≤k’≤j

         综上所述,当w满足四边形不等式时,函数s[i,j]具有单调性。

         因此,我们可以得到一个更优化的转移方程:

改进后的状态转移方程所需的计算时间为

上述方法利用四边形不等式推出最优决策的单调性,从而减少每个状态转移的状态数,降低算法的时间复杂度。

这样这道题就解决了。

一般的,对于状态转移方程形如:f[i , j] = opt{f[i , k] + f[k+1 , j]} + w[i , j], i


BY QW

转载请注明出处



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
author-avatar
邱氏家族_玉辈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有