| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> python programming training(三):动态规划 -> 正文阅读 |
|
[数据结构与算法]python programming training(三):动态规划 |
动态规划,说白了就是高中的数学归纳法。
目录 ?????????????? 动态规划(Dynamic Programming, DP)是运筹学的一个分支,是求解决策过程最优化的过程。美 R.Bellman在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。 1. 概念理解动态规划可以简单地理解为对传统递归的一种优化。Dynamic Programming不是编程,而是决策。只是这种决策不是一下就出来的,而是一步步(multistage)积累出来。换句话说我们需要一个决策,但这个决策太大了,我们做不了,所以需要把他递归到我们可以简单做出决策的状态,然后从这些状态开始,慢慢的“动态地”演进到最终的决策。
所以,DP在实践中很重要的就是递推关系和边界条件。 已知问题规模为n的前提A,求解一个未知解B。(我们用An表示“问题规模为n的已知条件”) 此时,如果把问题规模降到0,即已知A0,可以得到A0->B.
然而,Ai与Ai+1往往不是互为充要条件,随着i的增加,有价值的前提信息越来越少,我们无法仅仅通过上一个状态得到下一个状态,因此可以采用如下方案:
上述两种状态转移图如下图所示: 1.1 使用动态规划的条件该问题是否能用动态规划解决的是可以分为多个相关子问题,这些”小问题“会不会被被重复调用。而不是一个“大问题”能够被拆解为一堆“小问题”
首先对这个问题进行抽象,n个阶梯,每个阶梯都代表一个“位置”,就像是图论中的一个“点”,然后这n个不同位置之间会有一些桥梁把它们连接起来。==>也可以写成列表形式,或邻接矩阵。 idea:如果是暴力遍历的话,从3到10的时候,你肯定会把5-10的可能路径都算一遍,然后从4-10的时候,你又会把5-10的路径算一遍,也就是重复计算了。 solve:创建一个数组a[],专门来存放位点x到10的所有可能路径数。? ?a[5] = a[6] + a[7] a[4] = a[5] + a[6] ? ? ? ? ? ? ? ? 数学归纳法? ....... a[x] = a[x+1] + a[x+2] 我们发现在计算a[4]和a[5]的时候,都用到了a[6],也就是重复利用了结果。 ==>换句话说,如果从6-10的最优路径确定了,那无论是从3、4、5开始的路径,凡是再次到达6,那么从6往后的最优路径就不用再重复计算了。? 1.2 应用动态规划的步骤(1) 按顺序从小到大计算。因为如果直接让你计算f(11),你肯定一脸懵逼,但f(0), f(1)你却能很快理解,发现规律 (2) 建立状态转移方程。求得f(n)表达式 (3) 缓存以往结果以复用。比如刚刚求得f(99),如果不将其缓存起来,那么求f(100)时,我们就必须重新从头计算。? 1.3 DP和贪心算法区别?贪心:如果第一步到H和I都可以,第二步到P和Q都可以,那我每一步只选最优,用贪心得到结果。<== 因为你要经历的每个阶段状态跟决策无关,即每个阶段状态相互独立,互不影响。 但现实情况是,你第一步的选择会影响后面的分支。? 比如你第一步选择H或I,但是到了H后,你就只能选择经过P或Q到Z了,而如果到了I,你只能选择R或S到Z。 这样一来,即便第一步到H或I你选择了较好的一条路,也不保证最终结果最优。? ==> 所以我们要把所有的路都尝试一遍,才知道哪个最优。-->穷举 但我们只需要计算到每个共有状态的位置,求各阶段的最优,最后每阶段选最优组合贪心组合起来就行,因为共有状态不影响决策,即不影响最终最优路径选择。对A->H->Q->Z和A->I->Q->Z,Q->Z是共有状态。Q->Z的最优可减少每条经过Q的最优路径的重复计算,当然可能存在A->H->Z路径比任何一条经过Q的路径更短,但我们说的是减少经过Q往后的路径的重复计算。? 1.4 DP和递归区别1.4.1 斐波那契递归实现
递归这种方式造成栈空间极大浪费!!!? 其指数级时间复杂度跟不能用没啥区别!!!出个打个20分钟的电话都没结束 1.4.2 斐波那契动态规划实现
秒算? 2. 分类2.1 编号动态规划-->最大不下降子序列2.2 划分动态规划2.3 数轴动态规划:0-1背包问题2.4 前缀动态规划:最长公共子序列(LCS)3. leedcode实战案例举个例子🌰,才是最好懂的学习方式 参考[1] 知乎:如何理解动态规划? [2] 博客园:【算法复习】动态规划 [3] CSDN:六大算法之三:动态规划??????? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 1:41:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |