1D1D动态规划优化初步

合集下载

动态规划

动态规划

多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状 态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化 问题的方法为动态规划方法 。
任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适 用动态规划的问题必须满足最优化原理和无后效性 。
动态规划
运筹学的分支
01 原理
03 局限性
目录
02 分类
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年 代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理, 从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域, 并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了 显著的效果 。
最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成 的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足 最优化原理又称其具有最优子结构性质 。
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来 的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又 称为无后效性 。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因 素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点 。

动态规划算法的优化技巧

动态规划算法的优化技巧

动态规划算法的优化技巧福州第三中学毛子青[关键词] 动态规划、时间复杂度、优化、状态[摘要]动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。

全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。

[正文]一、引言动态规划是一种重要的程序设计方法,在信息学竞赛中具有广泛的应用。

使用动态规划方法解题,对于不少问题具有空间耗费大、时间效率高的特点,因此人们在研究动态规划解题时更多的注意空间复杂度的优化,运用各种技巧将空间需求控制在软硬件可以承受的范围之内。

但是,也有一部分问题在使用动态规划思想解题时,时间效率并不能满足要求,而且算法仍然存在优化的余地,这时,就需要考虑时间效率的优化。

本文讨论的是在确定使用动态规划思想解题的情况下,对原有的动态规划解法的优化,以求降低算法的时间复杂度,使其能够适用于更大的规模。

二、动态规划时间复杂度的分析使用动态规划方法解题,对于不少问题之所以具有较高的时间效率,关键在于它减少了“冗余”。

所谓“冗余”,就是指不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。

动态规划在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少了冗余。

但是,动态规划求解问题时,仍然存在冗余。

它主要包括:求解无用的子问题,对结果无意义的引用等等。

下面给出动态规划时间复杂度的决定因素:时间复杂度=状态总数*每个状态转移的状态数*每次状态转移的时间[1]下文就将分别讨论对这三个因素的优化。

这里需要指出的是:这三者之间不是相互独立的,而是相互联系,矛盾而统一的。

有时,实现了某个因素的优化,另外两个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。

因此,这就要求我们在优化时,坚持“全局观”,实现三者的平衡。

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例一、引言动态规划是一种求解最优化问题的算法,它具有广泛的应用领域,如机器学习、图像处理、自然语言处理等。

本文将详细介绍动态规划算法的原理,并提供一些使用案例,以帮助读者理解和应用这一算法的具体过程。

二、动态规划的基本原理动态规划算法通过将问题分解为多个子问题,并利用已解决子问题的解来求解更大规模的问题。

其核心思想是利用存储技术来避免重复计算,从而大大提高计算效率。

具体来说,动态规划算法通常包含以下步骤:1. 定义子问题:将原问题分解为若干个子问题,这些子问题具有相同的结构,但规模更小。

这种分解可以通过递归的方式进行。

2. 定义状态:确定每个子问题的独立变量,即问题的状态。

状态具有明确的定义和可计算的表达式。

3. 确定状态转移方程:根据子问题之间的关系,建立状态之间的转移方程。

这个方程可以是简单的递推关系式、递归方程或其他形式的方程。

4. 解决问题:使用递推或其他方法,根据状态转移方程求解每个子问题,直到获得最终解。

三、动态规划的使用案例1. 背包问题背包问题是动态规划算法的经典案例之一。

假设有一个背包,它能容纳一定重量的物品,每个物品有对应的价值。

目的是在不超过背包总重量的前提下,选取最有价值的物品装入背包。

这个问题可以通过动态规划算法来求解。

具体步骤如下:(1)定义问题:在不超过背包容量的限制下,选取物品使得总价值最大化。

(2)定义状态:令dp[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。

(3)状态转移方程:dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]),其中w[i]为第i个物品的重量,v[i]为第i个物品的价值。

(4)解决问题:根据状态转移方程依次计算每个子问题的解,并记录最优解,直到获得最终答案。

2. 最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的动态规划问题,它用于确定两个字符串中最长的共同子序列。

动态规划问题求解步骤

动态规划问题求解步骤

动态规划问题求解步骤动态规划问题是指在具有重叠子问题和最优子结构特性的问题中,通过将问题分解成更小的子问题,利用已解决的子问题的解来求解原问题。

动态规划问题的求解过程可分为以下几个步骤。

1. 定义状态:首先,我们需要明确问题的状态。

状态是指问题的子问题所依赖的变量或参数,即决定子问题解的输入。

状态可以是多个变量组成的元组,也可以是一个单一的变量。

定义好状态有助于我们更好地理解问题的本质,并能够将问题分解成更小的子问题。

2. 定义初始状态:在动态规划问题中,初始状态是问题的边界条件或者基本情况。

我们需要确定初始状态的值,并将其作为问题求解的起点。

初始状态的设置应符合问题的需求,并满足问题求解的逻辑。

3. 确定状态转移方程:状态转移方程是动态规划问题的核心。

通过定义状态之间的转移关系,我们可以将原问题分解为一系列的子问题,并通过已解决的子问题的解来求解当前问题的解。

状态转移方程的推导需要通过分析子问题间的关联关系,并根据问题的特点来定义。

状态转移方程应具备递推性,即当前问题的解可以通过之前子问题的解得到。

4. 确定计算顺序:在确定了状态转移方程后,我们需要确定求解问题的顺序。

一般来说,动态规划问题可以采用自底向上或自顶向下的方式进行求解。

自底向上的求解方式从初始状态开始,按照计算顺序逐步求解,直至得到最终问题的解;而自顶向下的求解方式则从最终问题的解开始,通过递归或备忘录等方式来求解子问题,最终得到初始状态的解。

5. 计算最优解:在得到了问题的所有状态和状态转移方程后,我们可以利用动态规划的思想来计算最优解。

根据计算顺序,我们先计算出初始状态的值,然后按照状态转移方程逐步计算,直到得到最终问题的解。

在计算的过程中,我们可以使用辅助数组或表格来存储和更新中间状态的值,以便于后续的计算,并最终得到问题的最优解。

通过以上步骤,我们可以较为系统地解决动态规划问题。

这种求解方法具有重用已解决子问题的解、减少重复计算和提高时间效率等优势,适用于诸如最优路径、最长子序列、最大连续子数组和背包问题等多种场景。

动态规划法

动态规划法

动态规划法动态规划法(Dynamic Programming)是一种常用的算法思想,主要用于解决具有重叠子问题性质和最优子结构性质的问题。

动态规划法通过把问题分解为更小的子问题,并将子问题的解存储起来,以避免重复计算,从而提高了算法的效率。

动态规划法有两个核心概念:状态和状态转移方程。

在动态规划过程中,我们需要定义状态,即问题的子问题解,以及状态之间的关系,即状态转移方程。

动态规划法的一般步骤如下:1. 定义问题的子问题:将问题划分为更小的子问题,并明确子问题的解是什么。

2. 定义状态:将问题的子问题解抽象为状态,即用一个变量或者数组表示子问题的解。

3. 定义状态转移方程:根据子问题的关系,定义状态之间的转移方程,即如何根据已知的子问题解计算出更大的问题的解。

4. 缓存子问题解:为了避免重复计算,我们需要将已经计算过的子问题解存储起来,以便后续使用。

5. 递推计算:通过状态转移方程和缓存的子问题解,逐步计算出更大的问题的解,直到计算出最终的问题解。

动态规划法的关键在于找到正确的状态转移方程和合理的存储子问题解的方式。

有些问题的状态转移方程比较容易找到,比如斐波那契数列,每个数都是前两个数的和;而有些问题的状态转移方程可能比较复杂,需要通过观察问题的特点和具体分析来确定。

动态规划法的时间复杂度通常为O(n),其中n 表示问题规模。

由于利用了子问题的解,避免了重复计算,因此动态规划法相对于暴力求解法能够大大提高算法的效率。

但是,动态规划法的空间复杂度通常较高,需要存储大量的子问题解,因此在实际应用中需要权衡时间和空间的消耗。

总的来说,动态规划法是一种非常灵活且强大的算法思想,能够解决许多复杂的问题,特别适用于具有重叠子问题性质和最优子结构性质的问题。

通过正确定义状态和状态转移方程,并结合缓存子问题解和递推计算,我们可以高效地求解这类问题,提高算法的效率。

动态优化模型

动态优化模型

动态优化模型动态优化模型是一种利用动态规划理论对优化问题进行建模与求解的方法。

它能够在不同环境下进行模型的动态调整,以求得最优解。

本文将介绍动态优化模型的基本概念与原理,并讨论其在实际问题中的应用。

一、动态规划的基本原理动态规划是一种以递归的方式进行求解的优化方法。

它将大问题分解为一系列子问题,并从子问题的最优解递归地求解出整个问题的最优解。

动态规划的核心思想是"最优子结构"和"重叠子问题"。

1. 最优子结构动态规划中的每个子问题必须具备最优子结构的特点,即如果一个问题的最优解包含了它的子问题的最优解,则称其具有最优子结构。

通过求解子问题得到的最优解可以作为整个问题的最优解的一部分。

2. 重叠子问题动态规划中的子问题往往是重叠的,即包含相同的子问题。

为避免重复计算,可以使用备忘录或者动态规划表来记录已求解的子问题的结果,在需要时直接检索以节省计算时间。

二、动态优化模型的建立动态优化模型通常包括三个基本要素:状态、状态转移方程和边界条件。

1. 状态状态是指问题中的一个变量或一组变量,它能够完整地描述问题的某个特定场景。

状态的选择对模型的性能和求解效果有着重要的影响。

2. 状态转移方程状态转移方程描述了问题中的状态如何转移到下一个状态。

它是建立动态规划模型的核心,通过定义合适的状态转移方程,可以准确地描述问题的演变过程。

3. 边界条件边界条件指定了问题的起始状态和终止状态,以及在某些特定情况下的处理方式。

它是动态规划模型中必不可少的部分,可以确定问题的边界和约束条件。

三、动态优化模型的应用动态优化模型广泛应用于各个领域,如经济学、管理学、运筹学等。

下面以背包问题和路径规划问题为例,说明动态优化模型的具体应用。

1. 背包问题背包问题是一个常见的优化问题,其目标是在给定的背包容量下,选择一定数量的物品放入背包中,使得背包内的物品总价值最大化。

动态优化模型中,可以将背包问题转化为一个二维的状态转移方程,并通过动态规划的方法求解最优解。

最优化多目标规划动态规划

最优化多目标规划动态规划

最优化多目标规划动态规划多目标规划是指在决策问题中同时考虑多个目标的优化问题,其目标可能相互矛盾或者相互关联。

动态规划是一种通过将问题划分为子问题并利用子问题的最优解来求解整体最优解的方法。

将多目标规划与动态规划结合起来,可以解决一些具有多个相互关联目标的决策问题。

下面将介绍最优化多目标规划动态规划的原理和应用举例。

1.定义决策变量:确定需要作出的决策,并定义决策变量。

2.建立状态转移方程:将问题划分为多个子问题,并建立它们之间的状态转移方程。

状态转移方程描述了子问题之间的关系,通过子问题之间的转移可以得到整体问题的最优解。

3.确定初始状态和边界条件:确定初始状态和边界条件,即子问题的初始状态和边界条件,用于递归地求解子问题。

4.递推求解:使用动态规划的递推求解方法,从初始状态开始,逐步求解子问题,直到求解出整体的最优解。

5.分析最优解:根据求解结果分析得到的最优解,并根据需要进行调整和优化。

假设有一家公司要进行产品的生产安排,公司有多个产品需要安排生产,每个产品有不同的生产时间和利润,同时公司还要考虑生产能力的限制和产品订单的要求。

问题可以建立如下的数学模型:决策变量:对于每个产品,决定其生产数量。

目标函数:最大化总利润。

约束条件:生产时间不能超过生产能力限制,同时生产数量要满足订单要求。

利用动态规划方法可以将问题分解为多个子问题,以子问题的最优解作为动态规划的递推依据。

具体步骤如下:1.将产品的生产时间和利润作为状态,根据时间顺序划分为多个子问题。

2.定义状态转移方程,将子问题的最优解与前面子问题的最优解关联起来。

3.初始状态为生产时间为0的情况,边界条件为订单要求。

4.递推求解,根据状态转移方程求解每个子问题的最优解。

5.分析最优解,确定每个产品的生产数量,以及总利润。

通过最优化多目标规划动态规划的方法,可以在满足多个目标和约束条件的情况下,求解出最优的决策方案。

这种方法可以应用于生产调度、资源分配、物流配送等领域,帮助企业做出合理的决策,达到优化目标。

动态规划算法

动态规划算法

动态规划算法
动态规划算法(Dynamic Programming)是一种解决多阶段最优化决策问题的算法。

它将问题分为若干个阶段,并按照顺序从第一阶段开始逐步求解,通过每一阶段的最优解得到下一阶段的最优解,直到求解出整个问题的最优解。

动态规划算法的核心思想是将问题划分为子问题,并保存已经解决过的子问题的解,以便在求解其他子问题时不需要重新计算,而是直接使用已有的计算结果。

即动态规划算法采用自底向上的递推方式进行求解,通过计算并保存子问题的最优解,最终得到整个问题的最优解。

动态规划算法的主要步骤如下:
1. 划分子问题:将原问题划分为若干个子问题,并找到问题之间的递推关系。

2. 初始化:根据问题的特点和递推关系,初始化子问题的初始解。

3. 递推求解:按照子问题的递推关系,从初始解逐步求解子问题的最优解,直到求解出整个问题的最优解。

4. 得到最优解:根据子问题的最优解,逐步推导出整个问题的最优解。

5. 保存中间结果:为了避免重复计算,动态规划算法通常会使
用一个数组或表格来保存已经求解过的子问题的解。

动态规划算法常用于解决最优化问题,例如背包问题、最长公共子序列问题、最短路径问题等。

它能够通过将问题划分为若干个子问题,并通过保存已经解决过的子问题的解,从而大大减少计算量,提高算法的效率。

总之,动态规划算法是一种解决多阶段最优化决策问题的算法,它通过将问题划分为子问题,并保存已经解决过的子问题的解,以便在求解其他子问题时不需要重新计算,从而得到整个问题的最优解。

动态规划算法能够提高算法的效率,是解决最优化问题的重要方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1D/1D 动态规划优化初步所谓1D/1D 动态规划,指的是状态数为O(n),每一个状态决策量为O(n)的动态规划方程。

直接求解的时间复杂度为O(n 2),但是,绝大多数这样的方程通过合理的组织与优化都是可以优化到O(nlogn)乃至O(n)的时间复杂度的。

这里就想讲一讲我对一些比较初步的经典的优化方法的认识。

本文中使用两种方式表示一个函数:f(x)与f[x],用方括号表示的函数值可以在规划之前全部算出(常量),而用圆括号表示的函数值必须在规划过程中计算得到(变量)。

无论是什么函数值一经确定,在以后的计算中就不会更改。

经典模型一:11()min{()[,]}x i f x f i w i −==+x ] 相信这个方程大家一定是不陌生的。

另外,肯定也知道一个关于决策单调性的性质: 假如用k(x)表示状态x 取到最优值时的决策,则决策单调性表述为:,当且仅当:,()()i j k i k j ∀≤≤ ,对于这个性质的证明读者可以在任意一篇讲述四边形不等式的文章中找到,所以这里不再重复。

而且,从实战的角度来看,我们甚至都不需要验证w 函数的这个性质,最经济也是最可靠的方法是写一个朴素算法打出决策表来观察(反正你总还是要对拍)。

当然,有的时候题目要求你做一点准备工作,去掉一些明显不可能的决策,然后在应用决策单调性。

这是上述性质也许会有点用处。

,[,][1,1][1,][,1i j w i j w i j w i j w i j ∀≤+++≤+++ 正如前文中所述,我们关注的重点是怎样实现决策单调性。

有了决策单调性,怎样高效地实现它呢?很容易想到在枚举决策的时候,不需要从1开始,只要从k(x-1)开始就可以了,但这只能降低常数,不可能起到实质性的优化。

另一种想法是从k(x-1)开始枚举决策更新f(x),一旦发现决策u 不如决策u+1来得好,就停止决策过程,选取决策u 作为f(x)的最终决策。

这样时间是很大提高了,但可惜是不正确的。

决策单调性并没有保证f(j)+w[j,x]有什么好的性质,所以这样做肯定是不对的。

刚才我们总是沿着“f(x)的最优决策是什么”这个思路进行思考,下面我们换一个角度,思考对于一个已经计算出来的状态f(j),“f(j)能够更新的状态有哪些”。

这样,每一步过程中某些状态的决策可能不是最优的,但是当算法结束的时候所有状态对应的决策一定是最优的。

一开始,只有f(1)的函数值被计算出来,于是所有状态的当前最优决策都是1。

111111111111111111111111111111111111111111111111111111111111111现在,显然f(2)的值已经确定了:它的最有决策只能是1。

我们用决策2来更新这个决策表。

由于决策单调性,我们知道新的决策表只能有这样的形式:111111111111111111111111111111222222222222222222222222222222这意味着我们可以使用二分法来查找“转折点”,因为如果在一个点x 上,如果决策2更好,则所有比x 大的状态都是决策2更好;如果x 上决策1更好,则所有比x 小的状态都是决策1更好。

现在决策1和决策2都已经更新完毕,则f(3)业已确定,现在用决策3来更新所有状态。

根据决策单调性,现在的决策表只能有以下2种类型:111111111111111111111111111111111222222222222222222333333333331111111111111111111111111333333333333333333333333333333333333而这样的决策表示绝对不会出现的:111111111111333333333333333333322222222222222222222222222222,不可能。

那么,我们的更新算法就是:1、 考察决策2的区间[b,e]的b 点上是否决策3更优,如果是,则全部抛弃决策2,将此区间划归决策3;如果否,则在决策2的区间[b,e]中二分查找转折点。

2、 如果第1问的回答是“是”,则用同样的方法考察决策1。

推演到这一步,相信决策单调性的实现算法已经明了了:使用一个栈来维护数据,占中的每一个元素保存一个决策的起始位置与终了位置,显然这些位置相互连接且依次递增。

当插入一个新的决策时,从后到前扫描栈,对于每一个老决策来说,做这样两件事:1、 如果在老决策的起点处还是新决策更好,则退栈,全额抛弃老决策,将其区间合并至新决策中,继续扫描下一个决策。

2、 如果在老决策的起点处是老决策好,则转折点必然在这个老决策的区间中;二分查找之,然后新决策进栈,结束。

由于一个决策出栈之后再也不会进入,所以均摊时间为O(1),但是由于二分查找的存在,所以整个算法的时间复杂度为O(nlogn)。

下面我们来看两个例题。

例题1:玩具装箱。

题目来源:湖南省选2008。

题目大意:有n 个玩具需要装箱,每个玩具的长度为c[i],规定在装箱的时候,必须严格按照给出的顺序进行,并且同一个箱子中任意两个玩具之间必须且只能间隔一个单位长度,换句话说,如果要在一个箱子中装编号为i~j 的玩具,则箱子的长度必须且只能是,规定每一个长度为l 的箱子的费用是,其中L 是给定的一个常数。

现在要求你使用最少的代价将所有玩具装箱,箱子的个数无关紧要。

[]j k i l j i c k ==−+∑2()P l L =−分析:本题可以很轻松地列出一个1D1D 的动态规划方程:11()min{()[1,]}x i f x f i w i −==++x ,其中。

2[,]([])j k i w i j j i c k L ==−+−∑ 不难验证这个方程式满足决策单调性的,于是我们可以直接套用上文中的方法进行优化,时间复杂度为O(nlogn)。

例题2:土地购买题目来源:USACO Monthly, March, 2008, Gold题目大意:有N 块土地需要购买,每块土地都是长方形的,有特定的长与宽。

你可以一次性购买一组土地,价格是这组土地中长的最大值乘以宽的最大值。

比方说一块5*3的土地和一块2*9的土地在一起购买的价格就是9*3。

显然,怎样分组购买土地是一门学问,你的任务就是设计一种方案用最少的钱买下所有的土地。

分析:将所有土地按照长度降序排列,依次检索,则当前土地的长度必然在上一块土地之内,我们只需要考虑宽度就可以了。

而在宽度的问题上,当前土地的行为只能是这样:和前面若干块土地绑定;同时这些绑定的土地和他们前后的土地分离。

这样很容易得出状态转移方程:)}(]1[*])[max {(min )(110k f k l i w n f nk i n k ++=+=−=这个方程还不能满足决策单调性,下面我们试图再做一下简化。

如果将每一个土地的尺寸看成是一个二维坐标的话,(如下图)其中不难看出,红色点完全可以忽略,这些点(x,y)必然满足一个性质:存在点(x’, y’)同时满足x’ >= x 且y’ >= y ,这样它就能被一个组完全覆盖。

这些被忽略的点可以通过一次线形的扫描得出。

下面,我们着重来看一下不能被忽略的这些点,它们的排布方式必然是单调减。

因此状态转移方程可以写成这个样子:)}(]1[*][{min )(10k f k y n x n f n k ++=−=这个转移方程就是标准的决策单调性了,读者可以通过w 函数的性质直接证明它。

然后,就用上文中的方法在O(nlogn)时间内求解。

以上两个例子都是决策单调性的直接应用。

其中第二个例子稍微复杂一些,如果不忽略那些“肯定无用”的决策,不对数据进行有序化,则方程是不满足决策单调性的。

这也就提醒我们在做这一类题目的时候不能钻牛角尖死做,还得灵活一点。

另外,决策单调性提供的只是O(nlogn)的算法,事实上上面两个例题的最佳算法都是O(n)的,在后文中我们将详细介绍另外一种经典模型,并且试图将这两个规划方程通过数学变换转向另一个模型。

====================================================================== 下面我们来看一类特殊的w 函数:,[,][,][,]i j k w i j w j k w i k ∀≤<+=,显然,这一类函数都是满足决策单调性的。

但是不同的是,由于这一类函数的特殊性,他们可以用一种更加简洁也更加有借鉴意义的方法解决。

由于w 函数满足,[,][,][,]i j k w i j w j k w i k ∀≤<+=,我们总是可以找到一个特定的一元函数w’[x],使得,[,]'[]'[]i j w i j w j w x ∀≤=−,这样,假设状态f(x)的某一个决策是k ,有:()()[,]()'[]'[]()'[]'[1],f x f k w k x f k w x w k g k w x w =+=+−=+−,其中()()[1,]g k f k w k =−。

这样我们发现:一旦f(k)被确定,相应地g(k)也被确定,更加关键的是,无论k 值如何,w’[x]-w’[1]总是一个常数。

换句话说,我们可以把方程写成下述形式:11()min{()}[1,]x k f x g k w −==+x 。

不难发现这个方程是无聊的,因为我们可以用一个变量“打擂台”直接存储;但是,如果在k 的下界上加上一个限制,那这个方程就不是很无聊了。

于是,我们就得到了另一个经典模型。

1min{()}xk g k =经典模型二:1[]()min{()}[]x k b x f x g k w −==+x ,其中,b[x]随x 不降。

这个方程怎样求解呢?我们注意到这样一个性质:如果存在两个数j, k ,使得j <= k ,而且g(k) <= g(j),则决策j 是毫无用处的。

因为根据b[x]单调的特性,如果j 可以作为合法决策,那么k 一定可以作为合法决策,又因为k 比j 要优,(注意:在这个经典模型中,“优”是绝对的,是与当前正在计算的状态无关的),所以说,如果把待决策表中的决策按照k 排序的话,则g(k)必然是不降的。

这样,就引导我们使用一个单调队列来维护决策表。

对于每一个状态f(x)来说,计算过程分为以下几步:1、 队首元素出队,直到队首元素在给定的范围中。

2、 此时,队首元素就是状态f(x)的最优决策,3、 计算g(x),并将其插入到单调队列的尾部,同时维持队列的单调性(不断地出队,直到队列单调为止)。

重复上述步骤直到所有的函数值均被计算出来。

不难看出这样的算法均摊时间复杂度是O(1)的。

相关文档
最新文档