| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> python数据结构之动态规划 -> 正文阅读 |
|
[数据结构与算法]python数据结构之动态规划 |
🐛今天要给大家介绍的内容是数据结构中一种较为重要的思想:动态规划(dynamic programming),听到这里,可能很多小伙伴会觉得这个词很陌生,觉得这是一种很复杂的思想,学习起来很困难,其实并不是这样,动态规划所讲述的知识与动态与规划并无太大关联。对往期内容感兴趣的小伙伴可以参考下面的文章👇:
🌹 当你能够理解并发现一类问题属于动态规划的问题时,你就会发现采用动态规划的思路能够大幅度减少解决问题的复杂度。 1. 动态规划的定义百度百科的定义:在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。 因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化的过程为动态规划方法。 动态规划问题有以下特点:
2.问题引入看完上面对于动态规划那么多文字,可能认真看完也不会有深入的了解,我们来举一个形象的例子: 2.1 青蛙跳台阶
碰到这种问题,大家开始想到的方法可能是枚举的方法,n=1时,有1种;n=2时,11、2是2种;n=3时,111、12、21是3种;n=4时…(在这里把第n阶台阶的走法次数记作dp[n])
所以,我们计算dp[3]时只需要计算dp[2]和dp[1],然后dp[3]=dp[2]+dp[1],同理,我们可以得到如下递推关系式: 看一下这道题的解法:
看一下运行结果: 我们来总结一下:
2.2 买卖股票挣钱最多让我们再来看一道题:
我们来分析一下,这道题利用双循环即可解决,第一个循环用来表示当前股票的价格i,第二个循环用来记录在当前股票价格为i下,后面的天卖出股票能获得的最大利润,这样的话时间复杂度为 O ( n 2 ) O(n^2) O(n2) 动态规划思想:我们将这个问题换个角度思考
以新的想法,我们就需要知道在第i天卖出股票时,和第i-1天卖出的股票最大利润相比哪个时间挣得多?声明dp[i]为在第i天时,股票所能获取的最大利润,那么我们就会出现如下表达式:
我们又找到了递推公式: 最终代码如下:
结果如下: 2.3 机器人寻路问题
这道题就留给大家思考吧,需要注意以下几个点:
3. 总结动态规划解决问题对看问题的角度有着独特的方式,开始学习可能会觉得别扭,但是经过一些题的训练,你就会找到最优子结构、无后效性等动态规划的特征,总而言之,多理解,多动手练习,动态规划不是问题! 4.参考资料《leetcode官网》 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/26 18:53:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |