1D1D动态规划优化初步

合集下载

1D1D动态规划优化初步

1D1D动态规划优化初步

1D1D动态规划优化初步在计算机科学和算法领域中,动态规划是一种非常强大的技术,用于解决具有重叠子问题和最优子结构性质的问题。

1D1D 动态规划,顾名思义,是在一维数据结构上进行的动态规划。

让我们先从一个简单的例子来理解动态规划的基本概念。

假设我们要计算从一个数组中找到最大连续子数组的和。

如果我们采用暴力枚举的方法,时间复杂度会非常高。

而动态规划则通过巧妙地利用之前计算的结果,避免了重复计算,从而大大提高了效率。

在 1D1D 动态规划中,我们通常会定义一个一维的数组来存储中间计算的结果。

比如说,对于上述的最大连续子数组和问题,我们可以定义一个数组 dp,其中 dpi 表示以第 i 个元素结尾的最大连续子数组的和。

那么,如何来计算这个 dp 数组呢?我们可以从第一个元素开始,逐步计算。

对于第 i 个元素,我们有两种选择:要么将当前元素单独作为一个子数组,要么将当前元素与前面以第 i 1 个元素结尾的最大连续子数组相加。

具体来说,dpi = max(numsi, dpi 1 + numsi)。

这里的 nums 是原始的数组。

通过这样的递推公式,我们就可以逐步计算出整个 dp 数组,最终的答案就是 dp 数组中的最大值。

接下来,让我们再看一个例子。

假设有一个楼梯,我们每次可以向上走 1 步或者 2 步,问到达第 n 个台阶有多少种不同的走法。

这也是一个典型的可以用 1D1D 动态规划解决的问题。

我们定义dpn 表示到达第 n 个台阶的不同走法数量。

那么,对于第 n 个台阶,我们可以从第 n 1 个台阶走 1 步上来,也可以从第 n 2 个台阶走 2 步上来。

所以,dpn = dpn 1 + dpn 2。

同时,我们需要给出初始值 dp1 =1 和 dp2 = 2。

通过这样的递推关系,我们就可以逐步计算出 dpn 的值。

在实际应用中,1D1D 动态规划的优化是非常重要的。

一种常见的优化方法是空间优化。

由于在计算 dpi 时,我们只用到了 dpi 1 和 dpi 2(或者类似的少量前面的值),所以我们不需要保存整个 dp 数组,只需要用几个变量来保存这些关键的值就可以了,从而大大节省了空间。

动态规划解决最优化问题的高效算法

动态规划解决最优化问题的高效算法

动态规划解决最优化问题的高效算法动态规划是一种高效解决最优化问题的算法。

它通过将问题划分为多个子问题,并利用子问题的最优解来求解整体问题的最优解。

本文将介绍动态规划算法的原理和应用。

一、动态规划的原理动态规划的基本思想是将原问题拆解为多个子问题,然后通过递推公式求解子问题的最优解,最后得到原问题的最优解。

其核心是利用子问题的最优解来求解整体问题的最优解。

动态规划的求解过程分为三个步骤:1. 定义子问题:将原问题分解为多个子问题,并定义子问题的状态。

2. 确定递推关系:确定子问题之间的递推关系,即子问题之间的重叠性质。

3. 求解最优解:使用递推公式从子问题的最优解中求解原问题的最优解。

二、动态规划的应用动态规划广泛应用于最优化问题的求解,包括线性规划、背包问题、最长公共子序列等。

下面以背包问题为例,介绍动态规划的应用过程。

背包问题是指在给定容量的背包和一组具有重量和价值的物品中,选择物品放入背包,使得背包中物品的总价值最大化。

动态规划可以通过以下步骤求解背包问题:1. 定义子问题:定义子问题的状态为背包容量和可选择的物品数量。

2. 确定递推关系:通过递推公式将子问题和原问题联系起来,递推公式为dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]),其中dp[i][j]表示前i个物品在容量为j的背包中的最大价值,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。

3. 求解最优解:通过递推公式,计算dp[i][j]的值,最后得到背包问题的最大价值。

三、动态规划算法的优势动态规划算法在解决最优化问题时具有以下优势:1. 高效性:动态规划算法通过将问题分解为多个子问题,避免了重复计算,从而提高了求解效率。

2. 最优性:动态规划算法可以保证求解出的最优解是全局最优解。

3. 可行性:动态规划算法使用递推公式进行求解,因此可以确保求解过程是可行的。

综上所述,动态规划是一种高效解决最优化问题的算法。

动态规划及其在算法优化中的应用

动态规划及其在算法优化中的应用

动态规划及其在算法优化中的应用1. 简介动态规划(Dynamic Programming)是一种求解类似于递归问题的优化算法。

它是将一个问题分解成较小的子问题,通过求解子问题的最优解来求解原问题。

动态规划最初用于解决一些经典的最短路径问题和背包问题,现在它已经成为了算法设计中的一种重要技术。

2. 原理动态规划的基本思想是将问题划分成多个子问题。

对于一个问题,如果能将它分解成多个子问题,并且每个子问题的解都能构成原问题的解,那么这个问题就具有最优子结构性质。

动态规划的核心是状态转移方程。

对于状态转移方程的求解,需要几个重要的步骤:(1)确定状态:将原问题分解成子问题时,需要定义状态,将每个子问题定义成一个状态。

(2)找到状态转移方程:状态转移方程通常是用来描述从一个状态到另一个状态的过程,其中包括状态的转移和状态转移的代价。

(3)计算最优解:使用初始状态和状态转移方程计算问题的最优解。

3. 应用动态规划的应用广泛,包括计算机科学、经济学、运筹学等领域。

下面是几个常见的应用。

(1)最短路径问题最短路径问题指的是在图中寻找从起点到终点的最短路径。

动态规划可以用来解决最短路径问题,通过定义状态为起点到其它节点的最短路径,然后使用状态转移方程来计算最短路径。

(2)背包问题背包问题是一种利用动态规划解决的经典问题。

给定一组物品和一个背包,每个物品都有一定的重量和价值,需要在不超过背包容量的前提下选取尽量多的物品。

动态规划通过定义状态为背包容量和物品数量,然后使用状态转移方程来计算背包中可以放置物品的最大价值。

(3)RNA序列匹配RNA序列匹配问题是生物信息学中的一个经典问题。

动态规划可以用来解决RNA序列匹配问题,通过定义状态为两个RNA序列的匹配状态,然后使用状态转移方程来计算两个RNA序列间的最佳匹配。

4. 优化动态规划在算法设计中的最大优点是可以将大问题分解成多个小问题,然后通过求解小问题的最优解来解决大问题。

动态规划的建立与优化

动态规划的建立与优化

动态规划的建⽴与优化概述动态规划(Dynamic Programming)本质上是将⼀个复杂的⼤问题分解为具有相同性质的⼩问题的解决问题的思路。

这种思想在OI中是极为重要的(of vital importance)。

因此OI中许多⾮最优化问题的递归/递推解法也被⾮正式地称作动态规划。

那么何时才会使⽤动态规划?很多时候都可以。

每当觉得⼀道题⾮常神仙时,都可以使⽤动态规划的思想尝试去解决它。

很多时候以为做不出来,其实都是可做的。

动态规划的建⽴动态规划由两⼤部分组成:1.状态设计 2.状态之间的转移状态设计要求选⼿在该状态能够转移的前提下,使⽤尽量少的参数来描述尽量多的⼦问题。

⽽状态间转移则是在状态设计的基础上,考虑下⼀步应该如何进⾏决策,从⽽转移到⼦问题。

以下列举⼏个经典案例:背包dp有若⼲物品,每个物品有价值 \(v_i\) 以及花费 \(w_i\) 。

现在你有 \(s\) 元钱,你要合理选择使得最终得到价值最⾼。

状态设计:记 \(f_S\) 表⽰选择的物品集合为 \(S\) 时的最⼤代价?状态数太多⽽⼀个状态所描述的同类⼦问题太少,不⾏。

记 \(f_{i}\) 表⽰考虑前 \(i\) 个物品时能得到的最⼤价值?⽆法转移。

记 \(f_t\) 表⽰当前还剩下 \(t\) 元钱时所能获得的最⼤价值?每个物品仅能选择⼀次,如何知道哪些物品已经被选择从⽽不能再选?因此⽆法转移。

但如果记 \(f_{i,j}\) 表⽰仅考虑前 \(i\) 个物品,现在恰好花了 \(j\) 元钱时的最⼤价值,就可以转移了。

(但这并不意味着这是唯⼀的状态定义⽅法)转移:考虑决策,即当前物品究竟是买还是不买,那么就有:\[f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_i}+v_i) \]⼩结通过这个案例,你会发现状态设计和其转移之间的强关联性。

⼀个状态设计是有意义的当且仅当它是能够转移的。

从背包dp可以看出序列类的dp通常都需要钦定只考虑前 \(i\) 个从⽽进⾏转移。

1D1D动态规划优化初步

1D1D动态规划优化初步

1D1D动态规划优化初步在计算机科学和算法领域,动态规划是一种非常强大且实用的技术。

1D1D 动态规划,顾名思义,是在一维数据结构上进行的动态规划操作。

它在解决许多实际问题时,能够提供高效且准确的解决方案。

让我们先从一个简单的例子来理解 1D1D 动态规划的基本概念。

假设我们有一个整数数组`arr`,其中的每个元素表示在该位置能够获取的价值。

我们要从数组的开头走到结尾,并且只能向右移动,求能够获取的最大价值。

这时候,我们可以用一个辅助数组`dp` 来记录每个位置的最优解。

`dpi` 表示从数组开头走到位置`i` 能够获取的最大价值。

对于第一个位置`i = 0`,`dp0 = arr0`,因为这是起始位置,能获取的价值就是该位置的元素值。

对于其他位置`i > 0`,`dpi = max(dpi 1 + arri, arri)`。

这意味着我们要么选择在前一个位置的最优解基础上加上当前位置的价值,要么直接选择当前位置的价值(如果前一个位置的最优解是负数,可能就不如直接选择当前位置)。

通过这样逐步计算,最终`dparrlength 1` 就是我们想要的结果,即从数组开头走到结尾能够获取的最大价值。

在这个简单的例子中,我们可以看到 1D1D 动态规划的几个关键步骤:1、定义状态:在这个例子中,状态就是`dpi`,表示走到位置`i` 的最大价值。

2、状态转移方程:即`dpi = max(dpi 1 + arri, arri)`,它描述了如何从一个状态转移到另一个状态。

3、初始化状态:`dp0 = arr0` 就是初始化。

接下来,我们再看一个稍微复杂一点的例子。

假设有一个数组`cost` 表示爬上每个台阶所需的体力值。

我们要爬到楼梯的顶部,每次可以爬 1 级或 2 级台阶,求到达顶部所需的最小体力值。

同样,我们定义一个辅助数组`dp`,`dpi` 表示到达第`i` 级台阶所需的最小体力值。

对于第一级台阶`i = 0`,`dp0 = cost0`。

有关概率和期望问题的研究

有关概率和期望问题的研究

有关概率和期望问题的研究河北唐山一中鬲融摘要在各类信息学竞赛中(尤其是ACM竞赛中),经常出现一些与概率和期望有关的题目。

这类题目需要较高的数学水平和一定的算法技巧,必须经过仔细分析,选择合适的数学模型和算法才能顺利的解决问题。

本文就对这类题目的一些常见方法进行了研究。

数学基础这里写的数学基础是有关概率和期望的一点简单的计算法则,虽然我们都很熟悉,但是有时也可能会忘记使用,所以在这里列出来,也作为以后内容的基础。

概率的运算➢两个互斥事件,发生任一个的概率等于两个事件的概率和➢对于不相关的事件或者分步进行的事件,可以使用乘法原则。

➢对于一般情况p(A+B)=p(A)+p(B)-p(AB)期望的运算➢E(φ)= Σφi P i,这是期望的定义,其中φi是一个取值,而P i是取这个值的概率➢期望有“线性”,也就是说对于不相关的两个随机变量φ和ξ,E(φ±ξ)=E(φ)±E(ξ);E(φξ)=E(φ)E(ξ);E(φ/ξ)=E(φ)/E(ξ)➢在某些情况下,期望可以表示成一个无穷的等比数列,然后利用极限的思想来求。

当然,这些只是最基础的知识,要解决好概率和期望的问题,还需要掌握一些组合数学的知识。

常用方法方法1 直接计算这种方法说起来很简单,就是推导出一个数学公式,然后通过程序来计算这个式子的值。

这样的题目在与概率和期望有关的题目中比例不小,但是由于它们大都需要一定的组合数学基础,而一旦推导出公式,对算法的要求并不太高,而时间复杂度往往也比较低,所以这类问题不是本文的重点。

有关内容可以在任何一本组合数学书中学到。

例一 百事世界杯之旅1“……在2003年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。

只要凑齐所有百事球星的名字,就可以参加百事世界杯之旅的抽奖活动,获取球星背包、随身听,更可以赴日韩观看世界杯。

还不赶快行动!……” 你关上电视,心想:假设有n 个不同球星的名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?输入输出要求输入一个数字n ,2≤n ≤33,表示不同球星名字的个数。

1D1D动态规划优化初步

1D1D动态规划优化初步

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 ∀≤≤,当且仅当:,[,][1,1][1,][,1]i j w i j w i j w i j w i j ∀≤+++≤+++,对于这个性质的证明读者可以在任意一篇讲述四边形不等式的文章中找到,所以这里不再重复。

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

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

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

正如前文中所述,我们关注的重点是怎样实现决策单调性。

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

动态规划利用数据结构优化问题求解过程

动态规划利用数据结构优化问题求解过程

动态规划利用数据结构优化问题求解过程动态规划(Dynamic Programming,简称DP)是一种常用的优化问题求解方法,通过将问题拆分为子问题,并利用子问题的解来求解整个问题。

而在动态规划的求解过程中,合理地选择和使用数据结构可以进一步提高算法效率。

本文将介绍动态规划的基本原理和常见的数据结构优化技巧。

一、动态规划的基本原理动态规划常用于求解具有重叠子问题特性的问题,是时间复杂度较高的问题求解方法之一。

其基本思想是将问题拆解为若干个子问题,并通过递推关系式来求解各个子问题的最优解,最终得到原问题的解。

在动态规划的求解过程中,一般会定义一个二维数组dp来保存子问题的解,其中dp[i][j]表示在问题规模为i时,达到状态j所获得的最优解。

通过填充dp数组中的元素,我们可以逐步推导得到最终的问题解。

二、动态规划与数据结构的结合在动态规划的求解过程中,合理地选择和使用数据结构可以进一步提高算法效率。

下面介绍几种常见的数据结构优化技巧。

1.队列(Queue)优化在某些动态规划问题中,我们需要维护一个队列来保存某些子问题的解,以便在后续的计算中使用。

例如,在最短路径问题中,我们可以利用队列来保存待计算的状态,以实现宽度优先搜索。

队列的先进先出特性使得我们可以按照顺序处理子问题,从而简化计算过程。

2.堆(Heap)优化在某些动态规划问题中,我们需要维护一个堆来保存某些子问题的解,以便在后续的计算中使用。

例如,在最小生成树问题中,我们可以利用堆来保存待计算的状态,并选择当前最优的状态进行扩展。

堆的有序性使得我们可以高效地选择最优解,加速算法的运行。

3.树(Tree)优化在某些动态规划问题中,我们需要维护一棵树来保存某些子问题的解,以便在后续的计算中使用。

例如,在字典树(Trie)匹配问题中,我们可以利用字典树来保存已匹配的前缀,以便在后续的匹配中高效地查找。

树的层次结构使得我们可以按照规则组织子问题,从而简化算法。

  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)的。

相关文档
最新文档