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. 保存中间结果:为了避免重复计算,动态规划算法通常会使
用一个数组或表格来保存已经求解过的子问题的解。
动态规划算法常用于解决最优化问题,例如背包问题、最长公共子序列问题、最短路径问题等。
它能够通过将问题划分为若干个子问题,并通过保存已经解决过的子问题的解,从而大大减少计算量,提高算法的效率。
总之,动态规划算法是一种解决多阶段最优化决策问题的算法,它通过将问题划分为子问题,并保存已经解决过的子问题的解,以便在求解其他子问题时不需要重新计算,从而得到整个问题的最优解。
动态规划算法能够提高算法的效率,是解决最优化问题的重要方法。
动态规划问题的基本要素和最优化原理ppt课件
选择变量既要能确切描述过程演变又要满足无后效性, 而且各阶段状态变量的取值能够确定。一般地,状态变量 的选择是从过程演变的特点中寻找。
3、确定决策变量及允许决策集合
通常选择所求解问题的关键变量作为决策变量,同时要 给出决策变量的取值范围,即确定允许决策集合。
精品课程《运筹学》
ppt精选版
4、确定状态转移方程
根据k 阶段状态变量和决策变量,写出k+1阶段状态变 量,状态转移方程应当具有递推关系。
5、确定阶段指标函数和最优指标函数,建立动 态规划基本方程
阶段指标函数是指第k 阶段的收益,最优指标函数是指 从第k 阶段状态出发到第n 阶段末所获得收益的最优值, 最后写出动态规划基本方程。
f1(s1)
最优目标函数值
V 1 * ,n V 1 * ,n (s 1 * ,u 1 * 子, 从策略k ,的到s 最终n * 优点,u 目最n * 标优)函策数略值
fs ov ps tu s
, , ,
k k
k ,n k k
uu , ,
k
n
n 1
精品课程《运筹学》
ppt精选版
§2.2 动态规划的基本思想
最优化原理:作为整个过程的最优策略具有这样 的性质:无论过去的状态和决策如何,相对于前面 的决策所形成的状态而言,余下的决策序列必然构 成最优子策略。”也就是说,一个最优策略的子策 略也是最优的。
精品课程《运筹学》
ppt精选版
§2.3 建立动态规划模型的步骤
1、划分阶段
划分阶段是运用动态规划求解多阶段决策问题的第一步, 在确定多阶段特性后,按时间或空间先后顺序,将过程划 分为若干相互联系的阶段。对于静态问题要人为地赋予 “时间”概念,以便划分阶段。
动态规划问题常见解法
动态规划问题常见解法
动态规划是一种高效解决优化问题的方法。
它通常用于涉及最
优化问题和最短路径的计算中。
下面是一些常见的动态规划问题解法:
1. 背包问题
背包问题是动态规划中的经典问题之一。
其目标是在给定的背
包容量下,选择一些物品放入背包中,使得物品总价值最大。
解决
这个问题的常见方法是使用动态规划的思想,定义一个二维数组来
记录每个物品放入背包时的最大价值,然后逐步计算出最终的结果。
2. 最长公共子序列问题
最长公共子序列问题是寻找两个字符串中最长的公共子序列的
问题。
解决这个问题的常见方法是使用动态规划的思想,定义一个
二维数组来记录两个字符串中每个位置的最长公共子序列的长度。
然后通过递推关系来计算出最终的结果。
3. 矩阵链乘法问题
矩阵链乘法问题是计算一系列矩阵相乘的最佳顺序的问题。
解
决这个问题的常见方法是使用动态规划的思想,定义一个二维数组
来记录每个矩阵相乘时的最小乘法次数,然后逐步计算出最终的结果。
4. 最长递增子序列问题
最长递增子序列问题是寻找一个序列中最长的递增子序列的问题。
解决这个问题的常见方法是使用动态规划的思想,定义一个一
维数组来记录每个位置处的最长递增子序列的长度,然后通过递推
关系来计算出最终的结果。
以上是一些常见的动态规划问题解法。
通过灵活运用这些方法,我们可以更高效地解决优化问题和最短路径计算等相关任务。
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)开始就可以了,但这只能降低常数,不可能起到实质性的优化。
动态规划的基本思想
动态规划的基本思想动态规划是一种常用于解决具有重叠子问题和最优子结构特征的问题的算法思想。
它将问题分解成一系列子问题,并通过解决子问题构建出整个问题的最优解。
动态规划的基本思想是将原始问题转化成一个或多个相似的子问题,然后通过解决这些子问题获得原始问题的解。
这种思想在很多实际问题中都能够得到应用。
动态规划的基本流程一般包括以下几个步骤:1. 将原始问题分解为子问题:首先需要将原问题划分为多个子问题,并且确保这些子问题之间有重叠的部分。
2. 定义状态:确定每个子问题需要求解的状态,也即问题需要达成的目标。
3. 确定状态转移方程:根据子问题之间的关系,确定子问题之间的状态转移方程,即如何将子问题的解转移到原问题的解。
4. 解决首个子问题:解决最基本的子问题,获得初始状态下的解。
5. 填充状态表格:根据状态转移方程,依次求解其他子问题,并且填充状态表格。
6. 求解原问题:通过填充状态表格,在保证状态转移方程的基础上求解原问题的最优解。
动态规划的关键在于将原问题转化为子问题,通过递归或者迭代的方式求解子问题,最终获得原问题的最优解。
在这个过程中,重叠子问题的求解是动态规划的特点之一。
由于问题的子问题存在重叠,所以在求解的过程中我们可以保存已经求解过的子问题的解,避免重复计算,从而提高效率。
动态规划还要求问题具有最优子结构特征,即问题的最优解可以通过子问题的最优解构建出来。
通过利用已解决的子问题的最优解,可以有效地解决原问题。
动态规划算法在实际应用中有着广泛的应用。
它可以用于解决很多经典的问题,如最长公共子序列、0-1背包问题、最大子数组和等。
动态规划算法可以有效地解决这些问题,使得它们的时间复杂度得到了有效的降低。
总结来说,动态规划的基本思想是将原始问题转化为子问题,并通过解决子问题构建整个问题的最优解。
动态规划算法通过保存已经解决的子问题的解来避免重复计算,从而提高算法的效率。
动态规划算法在实际应用中具有广泛的应用,是解决具有重叠子问题和最优子结构特征的问题的常用算法思想。
最优控制与最优化问题中的动态规划方法
最优控制与最优化问题中的动态规划方法动态规划方法是一种在最优控制和最优化问题中常用的方法。
它通过将问题分解为子问题,并利用子问题的最优解来求解整体问题的最优解。
本文将介绍动态规划方法的基本原理和应用,以及其在最优控制和最优化问题中的具体应用案例。
一、动态规划方法的基本原理动态规划方法的基本原理是将原问题分解为若干个子问题,并通过求解子问题的最优解来求解整体问题的最优解。
具体来说,动态规划方法有以下几个基本步骤:1. 定义状态:将问题的解表示为一个或多个状态变量。
2. 确定状态转移方程:根据问题的特点和约束条件,确定状态之间的转移关系。
3. 确定边界条件:确定问题的边界条件,即最简单的情况下的解。
4. 递推求解:利用状态转移方程和边界条件,递推求解问题的最优解。
二、动态规划方法在最优控制中的应用动态规划方法在最优控制中有广泛的应用。
最优控制问题的目标是找到一种控制策略,使得系统在给定的约束条件下达到最优性能。
动态规划方法可以用来求解最优控制问题的控制策略。
以倒立摆控制为例,倒立摆是一种常见的控制系统,其目标是使摆杆保持竖直位置。
动态规划方法可以将倒立摆控制问题分解为一系列子问题,每个子问题都是在给定状态下选择最优的控制动作。
通过递推求解子问题的最优解,最终可以得到整个控制过程的最优策略。
三、动态规划方法在最优化问题中的应用动态规划方法在最优化问题中也有广泛的应用。
最优化问题的目标是找到一组变量的最优取值,使得目标函数达到最小或最大值。
动态规划方法可以用来求解最优化问题的最优解。
以旅行商问题为例,旅行商问题是一个经典的最优化问题,其目标是找到一条路径,使得旅行商能够经过所有城市并且总路程最短。
动态规划方法可以将旅行商问题分解为一系列子问题,每个子问题都是在给定状态下选择最优的下一个城市。
通过递推求解子问题的最优解,最终可以得到整个旅行路径的最优解。
四、动态规划方法的优缺点动态规划方法有以下几个优点:1. 可以求解复杂的最优控制和最优化问题,具有较高的求解效率。
知识点归纳 算法与数据结构中的动态规划与图优化
知识点归纳算法与数据结构中的动态规划与图优化知识点归纳:算法与数据结构中的动态规划与图优化动态规划(Dynamic Programming)是一种解决复杂问题的算法思想,在算法与数据结构中有着重要的地位。
它通过将问题分解成若干个子问题,并记录中间结果,以求解最优解。
与之相关的图优化问题也是算法与数据结构中的热门话题。
本文将围绕动态规划和图优化两个主题展开,总结归纳相关知识点,并分析其应用场景和解决方法。
一、动态规划(Dynamic Programming)动态规划是一种算法设计方法,可以用来解决一些具有重叠子问题和最优子结构性质的问题。
它的核心思想是将原始问题分解成一系列相互依赖的子问题,并通过记录中间结果以减少重复计算,从而达到提高效率的目的。
在动态规划中,常见的解题思路包括自顶向下的记忆化搜索和自底向上的迭代求解。
其中,自顶向下的记忆化搜索利用递归函数来表示问题的整体结构,并通过缓存中间结果来避免重复计算;自底向上的迭代求解则通过定义一个状态转移方程,从问题的规模较小的子问题开始,逐步求解出整个问题的最优解。
动态规划问题的关键在于如何定义状态和状态转移方程。
通常,我们需要根据问题的具体特点来确定状态的含义和转移的方式。
常见的动态规划问题包括最长递增子序列、背包问题、最短路径等。
二、图优化(Graph Optimization)图优化是指在图结构上进行优化的一类问题。
在算法与数据结构中,图是非常常见且重要的数据结构,广泛应用于各个领域。
而图优化问题则是在给定的图上,寻找一种最优的布局、路径、连通性等问题。
图优化问题的求解方法多种多样,常见的有贪心算法、动态规划、分枝定界等。
具体要根据问题的特点和约束条件来选择合适的算法。
在图优化问题中,常见的案例包括最小生成树、最短路径、最大流最小割、旅行商问题等。
这些问题都有着重要的实际应用,如网络规划、交通路径规划、资源分配等。
三、动态规划与图优化的应用动态规划和图优化在实际问题中有着广泛的应用。
动态规划优化
2.1.2决策更新状态
当一个状态计算完毕,那么这个状态就 自然的成为了后面状态选择的一个决策, 于是我们可以在刚产生这个决策的时候 更新所有可能用到这个决策的状态。 可以说这是一个逆向行为的过程。 大多数时候正向方式和逆向方式是差不 多的,或者正向方式优于逆向方式,当 然也有例外,因此需要我们自己根据实 际情况灵活选择。
浅谈动态规划优化
2009曹文信息学奥林匹克夏令营 Author: Will
简介
动态规划优化的主要方法: 1、降维(优化状态) 2、优化转移 3、常数优化
1.降维
降维是一个通用的说法,其实质就是通 过改变动态规划的状态含义,或者抛弃 一些冗余状态环节,达到减少状态,加 速动态规划的目的
1.1.1.1思路一
按照基本的状态压缩动态规划模型进行 解答。 opt[K][S]表示已经放了前K行,并且每 一列是否有车的状态为S(S为一个0/1 的2进制序列,那一位为1则表示对应一 列已经放过了一个车)的合法方案的数 量。 比如opt[2][(101)2]即表示前2行放了车 且第1,3列有车的状态。
2.3.1.2优化
我们不妨换个思路,为什么要去纠结于 之前的状态呢? 当我们做了一个决策之后,对后面的影 响我们是知道的,为什么不能把握这一 我们清楚的信息呢? 道理很清楚:
2.3.1.2优化
每次决策后,我们将这一次移动对所有 我们还没有得到的小球产生的费用损失 都在决策时计算。 我们可以看作小球都没有动,只是在我 们每次决策是损失了一些价值。 假设当前移动花费了时间T,我们还没 有得到的小球的速度和是SV,那么损失 的代价就是T*SV/1000
2.4.1.2分析
动态规划的最优化原理有哪些内容
动态规划的最优化原理有哪些内容
动态规划的最优化原理包括以下内容:
1. 最优子结构性质:如果一个问题的最优解包含了其子问题的最优解,则称该问题具有最优子结构性质。
简单来说,就是问题的最优解由子问题的最优解构成。
2. 重叠子问题性质:在求解一个动态规划问题时,需解决很多相同或相似的子问题。
为了避免重复计算,可以使用备忘录或者动态规划表来存储已经计算过的子问题的解,以便之后需要时直接查表获取。
3. 无后效性:即一个状态的值一旦确定,就不受之后决策的影响。
在动态规划的状态转移方程中,只关心当前状态和之前的状态,不关心状态之后的发展。
4. 状态转移方程:动态规划的核心就是确定状态转移方程。
通过分析问题的特点,找到问题当前状态和之前状态之间的关系,从而推导出状态转移方程,进而解决整个问题。
动态规划的最优化原理是动态规划算法能够高效解决问题的基础,通过把问题划分为子问题,求解并保存子问题的解,最终得到原问题的最优解。
动态规划模型的建立与求解步骤
动态规划模型的建立与求解步骤动态规划(Dynamic Programming)是一种通过分解复杂问题为简单的子问题,并将其结果保存起来以便重复使用的方法。
其基本思想是从问题的边界条件开始,通过递推式逐步求解更大规模的子问题,直到最终解决整个问题。
动态规划常见的应用包括路径规划、背包问题、字符串匹配等。
下面将介绍动态规划模型的建立与求解步骤,以了解如何使用动态规划解决实际问题。
一、确定状态:在使用动态规划解决问题之前,首先需要确定问题的状态。
状态就是问题需要求解的子问题的集合,每个状态都对应一个解。
二、确定初始条件:初始条件是指在递推关系中最小的、无需依赖于其他状态的子问题的解。
它们可以给出问题的边界,为递推过程提供起点。
三、确定状态转移方程:状态转移方程是把大问题分解为小问题的规律。
通过观察和思考,可以找出问题的递推关系,即大问题如何由小问题组成。
四、确定计算顺序:确定计算顺序是指确定问题的求解顺序,通常是按照自底向上或自顶向下的顺序进行计算。
自底向上是从初始条件开始,逐步计算直到求解整个问题;自顶向下是从大问题开始逐步分解为小问题,直到达到初始条件。
五、实现状态转移方程:通过编程实现状态转移方程,并根据计算顺序逐步求解子问题。
可以使用递归或循环的方法进行实现。
六、求解最优解:根据问题的定义和要求,确定如何从求解的子问题中得到最优解。
通常最优解是基于一些目标函数或约束条件来定义的。
七、分析复杂度:分析算法的时间复杂度和空间复杂度,以确定算法的效率和可行性。
综上所述,建立和求解动态规划模型的步骤可以概括为以下几个阶段:确定状态、确定初始条件、确定状态转移方程、确定计算顺序、实现状态转移方程、求解最优解和分析复杂度。
根据具体问题的特点和要求,可以灵活选择和调整这些步骤,以得到最优的解决方案。
动态优化问题常见解法
动态优化问题常见解法动态优化问题是计算机科学中的一个重要领域,它涉及到在给定约束条件下,寻找最优解的问题。
在解决动态优化问题时,常用的几种解法包括贪心法、动态规划法和分治法。
贪心法贪心法是一种简单而常用的动态优化问题解法。
它的基本思想是在每一步都选择当前状态下最优的解,希望通过每一步的最优选择达到全局最优解。
贪心法通常适用于一些较为简单、局部最优即能得到全局最优的情况。
然而,贪心法并不适用于所有动态优化问题,特别是那些需要考虑长远后果的问题。
在使用贪心法解决问题时,需要仔细分析问题的特性以确定贪心策略的适用性。
动态规划法动态规划法是一种比较常用且灵活的动态优化问题解法。
它通过建立一个状态转移方程来逐步求解问题。
具体而言,动态规划法将原问题分解为子问题,然后利用已解决的子问题的解来求解更大规模的问题。
动态规划法通常需要建立一个动态规划表格或数组来存储子问题的解,以便在求解大问题时可以利用已经求解过的子问题的解。
动态规划法的关键在于确定子问题的解以及状态转移方程的定义。
分治法分治法是一种将问题分割为更小的子问题并分别解决的解法。
它的基本思想是将原问题划分为多个相互独立且结构相似的子问题,然后递归地解决这些子问题。
最后,将子问题的解合并得到原问题的解。
分治法通常适用于一些较为复杂的问题,能够有效地解决大规模问题。
然而,分治法并不是适用于所有动态优化问题,具体问题需要根据其特性来确定是否适用分治法进行求解。
总结在解决动态优化问题时,贪心法、动态规划法和分治法是常见的解法。
贪心法适用于一些较为简单且局部最优即为全局最优的问题。
动态规划法通过求解子问题来逐步求解大问题,适用于各类动态优化问题。
分治法通过将问题划分为子问题并递归求解,适用于复杂的大规模问题。
在选择合适的解法时,需要充分考虑问题的特性和约束条件。
每种解法都有其优缺点,在实际应用中需要仔细分析问题的性质以确定最合适的解法。
动态规划应用动态规划解决问题的思路与技巧
动态规划应用动态规划解决问题的思路与技巧动态规划应用 - 动态规划解决问题的思路与技巧动态规划(Dynamic Programming)是一种常见的算法思想,用于解决一些具有重叠子问题和最优子结构性质的问题。
通过将大问题划分为小问题,并将小问题的解存储起来以避免重复计算,可以在一定程度上优化问题的求解过程。
本文将介绍动态规划的应用,并提供一些思路与技巧。
一、动态规划的基本思路动态规划问题通常可以由以下步骤解决:1. 定义状态:将问题划分成若干子问题,并确定每个子问题需要记录的状态。
2. 定义状态转移方程:通过分析子问题之间的关系,建立状态转移方程,以表达子问题的最优解与更小规模子问题的关系。
3. 初始化边界条件:确定最小规模子问题的解,并初始化状态转移方程中需要用到的边界条件。
4. 递推求解:按照状态转移方程的定义,从较小规模的子问题开始逐步推导出较大规模的问题的解。
5. 求解目标问题:根据最终推导出的状态,得到原始问题的最优解。
二、动态规划的技巧与优化1. 滚动数组:为了降低空间复杂度,可以使用滚动数组来存储状态。
滚动数组只记录当前状态与之前一部分状态相关的信息,避免了存储所有状态的需求。
2. 状态压缩:对于某些问题,可以将状态压缩成一个整数,从而大幅减小状态的数量。
例如,当问题中涉及到某些特定的组合或排列时,可以使用二进制位来表示状态。
3. 前缀和与差分数组:对于某些问题,可以通过计算前缀和或差分数组,将问题转化为求解累加或差对应数组中的某个区间的值的问题,从而简化计算过程。
4. 贪心思想:有些动态规划问题可以结合贪心思想,在每个阶段选择局部最优解,然后得到全局最优解。
5. 双重循环与多重循环:在实际解决问题时,可以使用双重循环或多重循环来遍历状态空间,求解问题的最优解。
三、动态规划的实际应用动态规划广泛应用于各个领域,包括但不限于以下几个方面:1. 最短路径问题:例如,求解两点之间的最短路径、最小生成树等。
CDQ分治——精选推荐
CDQ分治引⾔:什么是CDQ分治?其实这是⼀种思想⽽不是具体算法,因此CDQ分治覆盖的范围相当⼴泛,在 OI 界初见于陈丹琦 2008 年的集训队作业中,故被称为CDQ分治。
⼤致分为三类:cdq分治解决与点对有关的问题cdq分治优化1D/1D 动态规划的转移通过 cdq 分治,将⼀些动态问题转化为静态问题先总体说⼀下CDQ分治:通常⽤来解决⼀类“修改独⽴,允许离线”的数据结构题。
实际上它的本质是按时间分治,即若要处理时间[l,r]上的修改与询问操作,就先处理[l,mid]上的修改对[mid+1,r]上的询问的影响,之后再递归处理[l,mid]与[mid+1,r],根据问题的不同,这⼏个步骤的顺序有时也会不⼀样。
CDQ 分治会使得我们考虑的问题的思维难度与代码难度⼤⼤减⼩,通常利⽤ CDQ 分治能使得⼀个树套树实现的题⽬,能够去掉外层的树,改为⽤分治来进⾏求解。
算法描述CDQ分治适⽤于满⾜⼀下两个条件的数据结构题:修改操作对询问的贡献独⽴,修改操作之间互不影响效果题⽬允许使⽤离线算法我们不妨假设我们需要(按顺序)完成的操作序列称为S,考虑将整个操作序列等分为前后两个部分,那么我们可以发下以下两个性质:显然,后⼀半操作序列中的修改操作对前⼀半操作序列中的询问结果不会产⽣任何影响。
后⼀半操作序列中的询问操作只受两⽅⾯影响:⼀是前⼀半操作序列中的所有修改操作;⼆是后⼀半操作序列中,在该询问操作之前的修改操作。
容易发现,因为后⼀半操作序列的修改操作完全不会影响前⼀半操作序列中的询问结果,因此前⼀半操作序列的查询实际是与后⼀半操作序列完全独⽴的,是与原问题完全相同的⼦问题,可以递归处理。
接下来我们来考虑后⼀半操作序列中的询问操作。
我们发现,影响后⼀半操作序列询问的答案的因素中,第⼆部分“后⼀半操作序列中,在该询问操作之前的修改操作”也是与前⼀半序列完全⽆关的(因为我们前⾯已经假定题⽬中的修改操作互相独⽴互不影响,⽽询问操作更不会影响修改操作了)因此,这部分因素也是与原问题完全相同的完全独⽴的⼦问题,可以递归处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)的。