算法启蒙ABC- 5:动态规划和贪心算法

Posted B座17楼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法启蒙ABC- 5:动态规划和贪心算法相关的知识,希望对你有一定的参考价值。

- 课程大类AGENDA  -

01 Scratch 初中高
01 女性编程日周二
02 Python 编程思维
02 数字设计3D实践
03 VEX IQ 理论和实战
03 创客体验 免费预约
04 ACM/NOI 算法
04 物联网基础实践

▽  课程体系和进度 ▽    


丁丁猫python课程解决初高中数学、物理真实任务为特色,突出python语言的高效用法。每个课题任务完整地学习:

如何换编程的思路重新描述数学问题?

如何验证编程逻辑是否严密?

如何对程序做边界测试

*第3点实际项目中侧重对求职面试考察重点

覆盖7个大模块,每个模块文末详细技能知识点。3个班的进度相同但讲的深度不同。课程设计中将感受到对逻辑课的高度重视,弥补国内K12编程和数学课程缺少的重要一环。


-  编程和机器人穿插必数学和物理

-  全球顶级的STEM在线课程提供线下辅导

-  既能视频一对一学习,也有线下授课


动态规划 是指一种解决问题的方法,在这种方法中,我们预先计算并存储较简单的、类似的子问题,以建立一个复杂问题的解决方案。它类似于递归,在递归中,计算基本情况使我们能够归纳出最终的价值。当新的数值只取决于以前的计算值时,这种自下而上的方法效果很好。


通过 动态规划 解决的问题的一个重要属性是,它应该有重叠的子问题。这就是DP与分治的区别,在分治中,存储较简单的值是没有必要的。 下面是一些通常通过动态编程解决的最有名的问题。

背包问题 :给定一组已知价值和权重的宝物,你应该选择哪一个,以使你的利润最大化,同时不损坏你的背包,因为背包有固定的容量?

丢蛋问题: 从一个有mm层的建筑物上投下n个鸡蛋,以计算出鸡蛋投下后开裂的最低高度,最好的方法是什么?

最长的公共顺序: 给出两个序列,哪一个是这两个序列共同的最长子序列?

子集之和问题: 给定一个集合和一个数值n, 是否存在一个子集,其元素之和为n?

斐波那契数。 有没有比普通递归更好的方法来计算斐波那契数?

信奥或ACM竞赛题目中, 动态规划 几乎总是会出现, 而且往往是以一种令人惊讶的方式,无论参赛者对它多么熟悉!

算法启蒙ABC- 5:动态规划和贪心算法

DP斐波那契数列在最短路径的应用

今天的视频来自麻省理工课堂,多花一些时间阅读原版算法教材还是值得。英文表达习惯对编程语言的影响比较算法明显许多。算法思维则是对思维过程的进一步提炼。

大喵下面先抛出简单问题。 动态规划解析:

状态定义:设 dp 为一维数组,其中 dp[i]的值代表 斐波那契数列第 i 个数字 。

转移方程:dp[i + 1] = dp[i] + dp[i - 1],即对应数列定义 f(n + 1) = f(n) + f(n - 1);

初始状态:dp[0] = 0, dp[1] = 1 ,即初始化前两个数字;

返回值:dp[n] ,即斐波那契数列的第 n 个数字。


空间复杂度优化:

若新建长度为 n 的 dp 列表,则空间复杂度为 O(N)。


由于 dp 列表第 i 项只与第 i-1 和第 i-2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum 使 a, b 两数字交替前进即可 。

节省了 dp列表空间,因此空间复杂度降至 O(1) 


This browser does not support music or audio playback. Please play it in Weixin or another browser. 算法启蒙ABC- 5:动态规划和贪心算法

Greedy Or Not? 

Computer Science Level 3 There is a list of coins :  coins = 

{100000,10000,1000,100,10,1} You want to know the minimum number of coins needed to achieve value V, so you asked the two best programmers in the world, Alice and Bob, and each of them proposed a different algorithm

公众号:B座17楼
首先Alice和Bob两人采用不同的思路和代码解决凑硬币的任务,比较两人代码的效率差别。

计算机科学第3级
有一组不同面值的硬币集合:
coins={100000,10000,1000,100,10,1}

你想编写一个函数实现凑成 价格为V所需的最少的硬币数,所以你问了熟悉的两个程序员:Alice和Bob各自提出了不同的算法:

Alice:DP
def dpMakeChange(L, V, minCoins):
for cents in range(V+1):
coinCount = cents
for j in [c for c in L if c <= cents]:
if minCoins[cents-j] + 1 < coinCount:
coinCount = minCoins[cents-j] + 1
minCoins[cents] = coinCount
return minCoins[V]

Bob:Greedy

def greedyMakeChange(L, V):
minCoin = 0
for change in L:
while V >= change:
V -= change
minCoin += 1
return minCoin
小心,特定的条件下,贪心的效率高于动态规划!

二、什么是贪心算法?
视频 讲解的非常详细




 1. Collections: 
List, Dictionary, Set, Tuple, Range, Enumerate, Iterator, Generator .
 2. Types:  
Type, String, Regular_Exp, Format, Numbers, Combinatorics, Datetime
 3. Syntax:   
Args, Inline, Closure, Decorator, Class, Duck_Types, Enum, Exceptions
 4. System:  
Print, Input, Command_Line_Arguments, Open, Path, Command_Execution.
 5. Data:  
CSV, JSON, Pickle, SQLite, Bytes, Struct, Array, MemoryView, D

以上是关于算法启蒙ABC- 5:动态规划和贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

五大常用算法:分治动态规划贪心回溯和分支界定

贪心算法 动态规划

动态规划算法介绍,以及和贪心算法的比较

动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会

Java版算法思想贪心算法&动态规划

Java版算法思想贪心算法&动态规划