IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 初识动态规划(dynamic programming)算法基本思想 -> 正文阅读

[数据结构与算法]初识动态规划(dynamic programming)算法基本思想

目录

一、常见算法:

二、动态规划描述:

三、斐波那契数列

四、给定一个数组,求任意不相邻数字的最大值

五、解决动态规划问题的一般步骤

六、课后小练习


一、常见算法:

1、动态规划算法;2、分治法;3、贪心算法,一种对某些求最优解问题的更简单、更迅速的方法,4、回溯法,一种选优搜索法;5、分支限界法。

二、动态规划描述:

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

动态规划算法的基本思想:是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

动态规划适用情况:

1.最优子结构
最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
2.无后效性
无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
3.子问题重叠
子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

三、斐波那契数列

fibonacci sequence :1,1,2,3,5,8,13,21,……? 求fib(n)

常规思路解法用递归时间复杂度为:O(2^N)

if (n == 1 || n == 2) {
    return 1;
}else{
    return fib(n - 1) + fib(n - 2);
}

当n变的很大时,查询速度会急剧下降,原因是在计算斐波那契的过程中出现了大量的子问题重叠过程,如下图所示

而通过非递归动态规划思想求解时间复杂度为O(n)

int fibo(int n){
??? ?if(n < 1) return -1;
??? ?int F[n+1];
?? ?F[1] = 1;
??? ?F[2] = 1;
??? ?for(int i = 3; i <= n; i++){
? ?? ??? ?F[i] = F[i-1] + F[i-2];
??? ?}
??? ?return F[n];
}

四、给定一个数组,求任意不相邻数字的最大值

例:比如给定数组:1,2,4,1,7,8,3

答案最大值为(1+4+7+3)15

递归形式:

def rec_opt(arr, n):
    if n == 0:
        return arr[0]
    elif n == 1:
        return max(arr[0], arr[1])
    else:
        A = rec_opt(arr, n - 2) + arr[n]
        B = rec_opt(arr, n - 1)
        return max(A, B)
print(rec_opt(arr,6))

而通过非递归动态规划思想求解:

def dp_opt(arr):
    opt = np.zeros(len(arr))
    opt[0] = arr[0]
    opt[1] = max(arr[0],arr[1])
    for i in range(2,len(arr)):
        A = opt[i-2] + arr[i]
        B = opt[i -1]
        opt[i] = max(A,B)
    return opt[len(arr)-1]
print(dp_opt(arr))

五、解决动态规划问题的一般步骤

??动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。

????初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

??? (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

??? (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

??? (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

??? (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

?? ?一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。

实际应用中可以按以下几个简化的步骤进行设计:

?? ?(1)分析最优解的性质,并刻画其结构特征。

?? ?(2)递归的定义最优解。

?? ?(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值

?? ?(4)根据计算最优值时得到的信息,构造问题的最优解

六、课后小练习

背包问题,有一个背包,容量为4磅,现有如下物品

物品重量价格
吉他(G)11500
音响(S)43000
电脑(L)32000
  1. 要求 讲物品装入背包,在不超出容量的情况下使背包的总价值最大
  2. 要求装入的物品不能重复
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:50:47  更:2021-11-12 19:51:21 
 
开发: 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 10:46:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码