精华内容
下载资源
问答
  • 2021-11-19 14:12:17

    一、定义

    动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题最短路径问题和复杂系统可靠性问题等中取得了显著的效果 。 

    二、基本思想和策略

            通常用于求解具有最优性质的问题,跟分治法类似,基本思想也是将待求解问题分解成若干个子问题,用子问题的解得到原问题的解。

            与分治法不同的是,动态规划求解的问题,子问题往往不是相互独立的,若用分治法解这类问题,分解得到的子问题太多,有些子问题,重复计算很多次。

            如果能保存已解决子问题的解,需要时找出已求解的解,就可以避免大量重复计算,所以可以用一个表来记录已求解子问题的解,这就是动态规划的基本思路。

    三、适用情况和基本特征

            适用动态规划算法必须满足最优化原理、无后效性和子问题重叠性

    1. 最优化原理(最优子结构性质)

            即一个最优化策略具有这样的性质,不论之前的状态和决策如何,对之前决策所形成的状态,后边的决策必须构成最优策略。也就是说,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。

    2. 无后效性

            即某阶段状态一旦确定,就不受这个状态之后决策的影响,某状态之后的过程不会影响之前的状态,换句话说,每个状态都是过去历史的一个完整总结,这就是无后向性,又称为无后效性。

    3. 子问题重叠性

            即子问题之间不是相互独立的,一个子问题可能在之后决策中被多次用到。

    四、算法特点总结

            动态规划将原来具有指数级时间复杂度的搜索算法,改进成了具有多项式时间复杂度的算法。其中的关键就是解决冗余,这是动态规划的根本目的。动态规划实质上是一种以空间换时间的技术,不得不存储各种状态,所以它的空间复杂度要大于其他算法。

            到底什么时候用动态规划:当每个阶段的最优状态可以从之前某个阶段的某个或者某些状态直接得到,而不管之前这个状态是如何得到的。

    五、解题步骤 

    1. 将原问题分解为子问题(注意:1,子问题与原问题形式相同或类似,只是问题规模变小了,从而变简单了; 2,子问题一旦求出就要保存下来,保证每个子问题只求解一遍)
    2. 确定状态(状态:在动规解题中,我们将和子问题相关的各个变量的一组取值,称之为一个"状态",一个状态对应一个或多个子问题所谓的在某个状态的值,这个就是状态所对应的子问题的解,所有状态的集合称为"状态空间".我的理解就是状态就是某个问题某组变量,状态空间就是该问题的所有组变量) 另外:整个问题的时间复杂度就是状态数目乘以每个状态所需要的时间
    3. 确定一些初始状态(边界条件)的值 (这个视情况而定,千万别以为就是最简单的那个子问题解,上面只是例子,真正实践动规千变万化)
    4. 确定状态转移方程 (这一步和第三步是最关键的 记住"人人为我"递推,由已知
    更多相关内容
  • 动态规划基本思想前言一、动态规划的定义二、动态规划的适用情况(即被求解问题具有的性质)2-1、最优子结构2-2、子问题重叠2-3、无后效性三、动态规划应用(斐波那契数列)3-1、采用传统递归方法3-2、使用动态规划...

    前言

    有些问题迟早要去面对。


    一、动态规划的定义

    动态规划:把一个待求解的问题划分成若干个子问题,先把各个子问题求解得出,再得出原问题的答案。对于多次出现的子问题,只求解一次,把答案保存起来,方便后续直接调用。(对于一些需要重复求解子问题的题目有很好的效果)

    二、动态规划的适用情况(即被求解问题具有的性质)

    2-1、最优子结构

    最优子结构:如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。

    2-2、子问题重叠

    子问题重叠:即被求解问题在采用递归算法自顶向下求解时,每次产生的子问题并不总是新问题,有许多重复的子问题。这样采用动态规划就可以把多次出现的子问题只求解一次,把答案保存起来,方便后续调用。

    2-3、无后效性

    无后效性:即被求解问题的子问题的解是确定的,不会受到其他子问题的影响。

    三、动态规划应用(斐波那契数列)

    斐波那契数列:1,1,2,3,5,8……
    求解斐波那契数列的第n项?

    3-1、采用传统递归方法

    # 使用传统方法,递归调用。
    def fb(n):
        if n < 3: return 1
        else: return fb(n-1)+fb(n-2)
    # n的值越大,则求解速度越慢,这是因为递归要求解大量的重复子问题。
    # 自顶向下解决问题
    

    3-2、使用动态规划思想

    # 使用列表生成式生成全为1的列表。
    x= [1 for i in range(50)]
    # 使用动态规划方法。
    def dp(n):
        i=2
        while i<n:
            x[i]=x[i-1]+x[i-2]
            i+=1
        # 列表下标从0开始,所以要减1.
        return x[i-1]
    # 自底向上解决问题,每个子问题都会记录在列表中,
    

    四、动态规划解决问题的步骤

    参考链接:
    动态规划的思想.
    动态规划基本思想.


    总结

    提示:这里对文章进行总结:
    例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

    展开全文
  • 动态规划基本思想

    千次阅读 2018-07-04 11:24:38
    动态规划和分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,动态规划法中分解得到的子问题不是互相独立的。若用分治法来解这类...

    基本要素:
    (1)最优子结构性质
    (2)重叠子问题性质
    思想:
    动态规划和分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
    与分治法不同的是,动态规划法中分解得到的子问题不是互相独立的。若用分治法来解这类子问题,分解得到的子问题数目非常多,最后解决原问题需要耗费指数时间。但是这些子问题有很多是相同的,也就是同一个子问题被计算了很多次,不同子问题的数量可能只有多项式量级。
    如果我们保存已经解决的子问题的解,需要解相同子问题时找出已经计算出的解,这样可以减少大量重复计算,最终得到多项式时间算法。
    经常用一个来记录所有已解决的子问题的解。不管该子问题以后是否被利用,只要它被计算过,就将其结果填入表中。这就是动态规划的基本思想。具体的动态规划算法多种多样,但它们具有相同的填表格式

    —(计算机算法设计与分析 第四版 王晓东)—
    ####动态规划例子:(矩阵连乘问题)
    给定N个矩阵{A1,A2,A3,An},其中Ai与A(i+1)是可以相乘的,考察这N个矩阵的连乘积A1A2,An。
    由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定,比如下面4个矩阵的连乘积。
    A1,A2, A3, A4
    1,(2,(3,4))
    1,((2,3),4)
    (1,2),(3,4)
    (1,(2,3)),4
    ((1,2),3),4

    #####最优解的结构
    计算A[1:n]的最优次序所包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。
    A[1:n] = A[1:k] * A[K+1:n] 其中 ( 1 < k < n)
    递推关系如下:
    m(i , j) = 0 ,(i=j)
    m(i , j) = min{ m(i,k) + m(k+1,j) + P(i-1)P(k)P(j) } ,(i < j )
    #####重叠子问题
    重叠的子问题主要体现在m表格里,

    例题:我们计算如下6个矩阵的连乘积,
    A1 ------ A2 ------ A3 ----- A4 ----- A5 ----- A6
    (3035) (3515) (155) (510) (1020) (2025)

    const int N = 6;
    int table[N + 1][N + 1];
    int p[N + 1] = { 30, 35, 15, 5, 10, 20, 25 };
    void MatrixMulti()
    {
    	for (int r = 2; r <= N; r++) //r表示连乘矩阵的个数
    	{
    		for (int i = 1; i <= N - r + 1; i++) //i表示起始矩阵索引
    		{
    			int j = i + r - 1; //j表示终止矩阵索引
    			for (int k = i; k < j; k++)
    			{
    				int temp = table[i][k] + table[k+1][j] + p[i - 1] * p[k] * p[j];
    				table[i][j] = (table[i][j] == 0) ? temp : min(table[i][j], temp);
    			}
    		}
    	}
    }
    int main()
    {
    	MatrixMulti();
    	cout << "最小乘积为:" <<table[1][N] << endl;
    	return 0;
    }
    /*输出结果:
    最小乘积为:15125
    table数组内容为:
    0       0       0       0       0       0       0
    0       0       15750   7875    9375    11875   15125
    0       0       0       2625    4375    7125    10500
    0       0       0       0       750     2500    5375
    0       0       0       0       0       1000    3500
    0       0       0       0       0       0       5000
    0       0       0       0       0       0       0
    
    */
    
    展开全文
  • 动态规划1:基本思路

    2021-07-11 19:49:28
    妈妈再也不用担心我的动态规划 基本介绍 1.动态规划的一般形式就是求最优值,比如最长公共子序列、最大子段和、最优二叉搜索树等等。 2.一般暴力破解的题目,即通过遍历所有情况,得到其中的最优解,均可采用动态...

    妈妈再也不用担心我的动态规划

    基本介绍

    1.动态规划的一般形式就是求最优值,比如最长公共子序列、最大子段和、最优二叉搜索树等等。
    2.一般暴力破解的题目,即通过遍历所有情况,得到其中的最优解,均可采用动态规划的方式,保存已经解决的子问题的答案,减少重复计算,进而实现剪枝的目的。
    3.因重点在于状态转移方式,暂称之为
    状态转移方程法/递推方式法
    ,不过这种问题要用dp命名变量Dynamic Programming,DP),更具专业性。
    4.与分治法不同的是,适合动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。

    动态规划的基本要素

    重叠子问题性质

    动态规划经分解得到的子问题往往不是相互独立,即存在重复计算,通过保存答案,减少重复计算。
    即计算f(n)会和f(n-1)甚至f(n-2)……有一定关系,即存在重复的计算,这里应该又和最后子结构性质带来了一定的关联性,还是类似套娃。

    最优子结构性质

    当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质
    即类似套娃,或者用最简单的示例就是f(n)的最优解,和f(n-1)的最优解 相关,这个不是绝对相关。

    基本解题步骤

    1.题型判断:如何断定一个问题是动态规划问题?

    一般情况下,需要求最优解的问题(最短路径问题,最长公共子序列,最大字段和等等,出现 字你就留意),在一定条件下对排列进行计数的计数问题(丑数问题)或某些概率问题都可以考虑用动态规划来解决。

    可以根据给出的题目,比划比划,发现计算后面的值,需要用到前面计算的结果,那就存在**重叠子问题性质。**大多数经典的动态规划问题还满足最优子结构性质。

    2.确定状态

    感觉主要是看看,用一维的表示,还是得用二维的表示;感觉就是用一维的不行,就得用二维的。

    即用来标记这种情况下,对应的值的情况。DP[] 或者DP[][],其对应的值即为这种情况对应的最优解。
    至于状态,用来标识当前的参数,进而标识一个个的子问题。
    如斐波那契数中,0 , 1, …, n 就可以视为参数,而通过这些参数定义出的 DP[0],DP[1],DP[2],…,DP[n] 就是状态,而状态与状态之间的转移方程就是 DP(n) = DP(n-1) + DP(n-2) 。
    经典的背包问题(Knapsack problem)中,状态通过 indexweight 两个参数来定义,即 DP[index][weight] 。DP[index][weight] 则表示当前从 0 到 index 的物品装入背包中可以获得的最大重量。

    3.构造状态转移方程

    即确定下一个的解和之前的解的关系。
    根据题目给定的条件,枚举若干子状态,然后尝试用这些子状态构造出未知状态的解,就可以轻松得到状态转移方程,当然这一步离不开大量的练习

    第四步:为状态添加备忘录或者 DP Table

    这个可以说是动态规划最简单的部分,我们仅需要存储子状态的解,以便下次使用子状态时直接查表从内存中获得。

    备忘录 vs DP Table

    备忘录方法是自顶向下对问题求解,与直接递归方法的控制结构相同,而动态规划方法是自底向上对问题求解,与迭代实现方式的结构一致

    DP Table 法(自底向上的动态规划)

    顾名思义,自底向上就是从底部(递归的出口,动态规划中称为 base case)开始,不断向上回溯,计算出问题的解。下面看一下 DP Table 的状态转移过程。
    设 DP 问题的基态(Base State)为 dp[0] ,目标状态为 dp[n]
    如果我们从基态 dp[0] 开始转移,在遵循状态转移方程的情况下到达目标状态 dp[n] ,则将其称为 “自底向上” 的方法。(dp[0] → dp[n])

    即从小问题,开始慢慢计算,最后得到N的解,这种容易理解。

    备忘录法(自顶向下的方法)

    从状态 dp[n] 开始,经状态转移向下寻找所需要的子状态的值,直到找到所有与状态 dp[n] 相关的子状态,并返回 dp[n] ,这就是自顶向下的备忘录方法。

    当考虑二维数组的情况下,就像最小成本路径问题一样,此时的内存将不是按照顺序存储。

    两者比较

    状态:DP Table 状态转移关系较难确定,备忘录状态转移关系较易确定。你可以理解为自顶向下推导较为容易,自底向上推导较难。比如 DP[n] = DP[n - 1] + DP[n - 3] + DP[n-5] 的确定。

    代码:当约束条件较多的情况下,DP Table 较为复杂;备忘录代码相对容易实现和简单,仅需对递归代码进行改造。
    效率:动态规划(DP Table)较快,我们可以直接从表中获取子状态的解;备忘录由于大量的递归调用和返回状态操作,速度较慢。

    子问题的解:当所有的子问题的解都至少要被解一遍,自底向上的动态规划算法通常比自顶向下的备忘录方法快常数量级;当求解的问题的子问题空间中的部分子问题不需要计算,仅需求解部分子问题就可以解决原问题,此时备忘录方法要优于动态规划,因为备忘录自顶向下仅存储与原问题求解相关的子问题的解。

    表空间:DP Table 依次填充所有子状态的解;而备忘录不必填充所有子问题的解,而是按需填充。

    参考:

    1.算法图解-第9章 动态规划(提供了一个形象的由浅入深的认知)
    2.动态规划之武林秘籍 https://mp.weixin.qq.com/s/CXLM0KC3eYYl6u2NsCpW4g
    (真正让我形成了一定的策略,建议看原文)
    3.力扣 题目来源+练习验证

    展开全文
  • 五大算法基本思想—分治,动态规划,贪心,回溯,分支界限,算法数据结构 五大常用算法
  • 文章目录1.序2.动态规划的基本概念[^1]3.动态规划算法的基本思想[^2]4....这篇文章主要介绍动态规划算法的基本思想、使用动态规划算法求解问题的基本步骤、动态规划算法的两个基本要素以及一些经典的动态规划问题。...
  • 一、动态规划的三大步骤 定义:动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存 步骤一:定义数组元素含义,例如定义一个二...
  • 动态规划基本思想

    千次阅读 2019-01-11 16:25:59
    分治法 将一个规模为n的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解决这些问题,然后将各个子问题的解合并... 动态规划的实质是分治思想和解决冗余,因此动态规划是一种将问题 ...
  • 动态规划基本思路理念 动态规划的解题思路是: 首先将原问题分解成一个个合理的子问题。 怎样算合理呢? 要求子问题的最优值可以由更小规模的子问题的最优值推导出来。 之后就有了DP状态和DP转移方程的概念 1.DP...
  • 动态规划基本要素

    2021-04-26 16:07:55
    该问题可用动态规划算法求解的基本要素 1.最优子结构 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。最优子结构性质提供了该问题的可用动态规划算法求解的重要线索。 动态规划,利用问题的...
  • 动态规划算法 动态规划算法基本思想: 1、 将待求解问题分阶段处理 2.doc
  • 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过...
  • 一、动态规划基本思想 动态规划算法通常用于求解具有某种最优性质的问题 在这类问题中,可能会有许多可行解。 每一个解都对应于一个值,我们希望找到具有最优值的解 基本思想是将待求解问题划分成若干个子问题...
  • 动态规划之一:基本思想

    万次阅读 2018-06-03 23:09:17
    基本思想一般来说,只要问题可以划分为规模更小的字问题,并且原问题的最优解中包含了子问题的最优解,则可以考虑用动态规划解决。动态规划的实质是分治思想和解决冗余。因此,动态规划是一种将问题实例分解为更小的...
  • 分析动态规划算法的基本思想,应用动态规划策略写出算法及相应的程序,求解此题。要读懂读透A[i,j],A[1,n]=A[1,k] ×A[k+1,n],m[i][j],s[i][j]各式所表达的含义并正确加以应用。m[i][j]的递归定义:
  • 先讲一个问题来了解动态规划算法的思想 矩阵连乘问题 问题描述:给定 n 个矩阵 { A1, A2, … , An } 其中相邻的矩阵是可乘的,求它们的连乘积 A1, A2, … , An 完全加括号:以加括号的形式,明确指明矩阵连乘的计算...
  • 动态规划: 决策者当前的做出决策会影响到后续的决策选择,决策时当前状态是从所有能转移到当前状态的所有状态的代价加上转移的代价中选择一个最优的,从而达到一个状态转移到另一个状态的目的,目标状态从能。...
  • 动态规划简介及基本思想

    千次阅读 2019-10-09 08:56:25
    动态规划(Dynamic Programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
  • 动态规划基本问题

    2021-11-30 19:39:13
    基本思想:(总的来说就是把一个问题分成若干个子问题,再为每个子问题求最优解,最终得 到全局最优解的过程,取决于该问题是否能用动态规划解决的是这些”小问题“会 不会被被重复调用。) 动态规划算法通常用于...
  • 动态规划基本思路和最小硬币问题 动态规划有极其重要的应用.我总结了一下思路: 基本思路 1.观察是否满足最优子结构: 大问题可以由小问题推出,大问题与小问题求解思路一致。 2.观察是否满足无后效性: 一旦F(n)确定,...
  • 动态规划有着比较详细的讲解,比如动态规划的一般步骤,动态规划思想
  • 顺序解法 顺序解法的阶段变量k决策变量x 以及决策变量允许集合Q 的含义和逆序解 k k 法模型中相应变量的含义相同而状态变量s 表示第k阶段结束时的状态其中 k k=0,1,2,n记状态转移方程为 s =g(s ,x ) k=1,2,n k k-1 k...
  • 动态规划——基本思想

    万次阅读 2016-07-14 15:08:10
    动态规划——基本思想动态规划的特点 把原始问题划分为一系列子问题 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间 自底向上地计算 使用范围 一类优化问题:...
  • 1. 动态规划算法思想 2. 动态规划求解问题的基本步骤 二. 动态规划算法问题案例 1. 硬币选择问题 2. 斐波那契数列 3. 最大子段和问题 4. 最长非降子序列LIS问题 5. LCS最长公共子序列 6. 0-1背包问题 7. 三角数组...
  • 初识动态规划(dynamic programming)算法基本思想 ​ 目录 一、常见算法: 二、动态规划描述: 三、斐波那契数列 四、给定一个数组,求任意不相邻数字的最大值 五、解决动态规划问题的一般步骤 六、课后小练习 ​ 一...
  •  动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想与策略  基本思想与分治...
  • 动态规划是算法设计中一种方法 它讲一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题 解决实例-斐波那契数列问题 leetcode:70 爬楼梯 解题思路 爬到第n阶可以在第n-1阶爬1个台阶,或在第...
  • 动态规划基本概念

    2019-09-22 20:47:54
    一、动态规划的三要素:阶段,状态,决策 如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,695
精华内容 28,678
关键字:

动态规划的基本思想