动态规划Dynamic Programming

code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路

理解动态规划:

递归与动态规划的联系与区别 -> 记忆化搜索 -> 本质:动态规划

什么时候使用动态规划:

使用动态规划的三个条件

1.求最大值最小值/判断是否可行/统计方案个数 2.求所有方案/集合而不是序列 3.把2^n优化成n^2的题目

不使用动态规划的三个条件

1.求出所有具体的方案而非方案个数 2.输入数据是一个集合而不是序列 3.暴力算法的复杂度已经是多项式级别(不适合把n^3优化成n^2)

动规四要素:

状态state:

灵感,创造力,存储小规模问题的结果。用F什么什么代表什么什么(最难的部分)。dp的难点主要是状态的设计,所以推荐从dfs入手,dfs的状态就是和dp的状态差不多的,dfs(x,y) dp[x][y],搜索的参数就是一种状态


方程function:

状态之间的联系,怎么通过小的状态,来算大的状态

初始化Initialization:

最极限的小状态是什么,起点

答案Answer:

最大的那个状态是什么,终点

与递归进行比较:

递归三要素:

定义(状态): 1.接受什么参数 2.做了什么事 3.返回什么值

拆解(方程): 如何将参数变小

出口(初始化): 什么时候可以直接return

多重循环 vs 记忆化搜索

多重循环:优点:正规,大多数面试官可以接受,存在空间优化可能性。缺点:思考有难度

记忆化搜索:优点:容易从搜索算法直接转化过来。有的时候可以节省更多的时间。缺点:递归

能用DP的肯定也可以用DFS做,DP是不做重复的事情,那DFS就会出现大量做重复的事情,所以DFS效率低

相关题目:

45. Jump Game II

55. Jump Game

62. Unique Paths

63. Unique Paths II

64. Minimum Path Sum

70. Climbing Stairs

72. Edit Distance

97. Interleaving String

115. Distinct Subsequences

120. Triangle

131. Palindrome Partitioning

132. Palindrome Partitioning II

139. Word Break

140. Word Break II

174. Dungeon Game

300. Longest Increasing Subsequence

741. Cherry Pickup

https://leetcode.com/problems/dungeon-game/

面试中常见的动态规划类型

坐标型动态规划15

state:

f[x] 表示我从起点走到坐标x 代表的是一个个体,当前x位置的f(x) 值

f[x][y] 表示我从起点走到坐标x,y…

function: 研究走到x,y这个点之前的一步

Initialize: 起点

answer:终点

P.S.初始化一个二维的动态规划时,就去初始化第0行和第0列

序列型动态规划30多用于String

state: f(i) 代表的是一个整体,前i个
function: f[i] = f[j] ….j是i之前的一个位置
initialize: f[0]
Answer: f[n]
一般answer是f(n)而不是f(n-1):因为对于n个字符,包含前0个字符(空串), 前1个字符…前n个字符。
方案总数(最多/最少)和yes or no是一个意思

双序列动态规划 30 两个sequence

state: f[i][j] 代表了第一个sequence的前i个数字/字符,配上第二个sequence的前j个
function: f[i][j] = 研究第i个和第j个的匹配关系
initialize: f[i][0] 和 f[0][i]
Answer: f[n][m]
N = s1.length()
M = s2.length()

LCS/方案总数大部分都是DP,唯一不是的是N-Queen

划分型动态规划 30

背包型动态规划 10

区间型动态规划 5


动态规划Dynamic Programming的更多相关文章

  1. 6专题总结-动态规划dynamic programming

    专题6--动态规划 1.动态规划基础知识 什么情况下可能是动态规划?满足下面三个条件之一:1. Maximum/Minimum -- 最大最小,最长,最短:写程序一般有max/min.2. Yes/N ...

  2. 动态规划(Dynamic Programming)算法与LC实例的理解

    动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. [算法]动态规划(Dynamic programming)

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...

  5. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  6. 动态规划系列(零)—— 动态规划(Dynamic Programming)总结

    动态规划三要素:重叠⼦问题.最优⼦结构.状态转移⽅程. 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」. 某种 ...

  7. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  8. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

  9. 后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点

    1. array_chunk 实现 http://php.net/manual/en/function.array-chunk.php <?php function my_array_chunk ...

随机推荐

  1. gitlab 存储仓库目录设置及数据迁移

    注:一开始没有考虑到把gitlab划分好存储目录,占用系统磁盘,由于gitlab是默认安装的,随着公司代码越来越多,导致gitlab数据目录空间不足 磁盘空间: [root@gitlab ~]# df ...

  2. 王之泰201771010131《面向对象程序设计(java)》第十五周学习总结

    第一部分:理论知识学习部分 第13 章 部署应用程序 1.jar文件 a) java 程序的打包:编译完成后,员 将.class 文件压缩打包为 .jar 文件后, GUI 界面 程序就可以直接双击图 ...

  3. js基础语句

    // for 循环语句 // if else 条件判断语句 // switch 条件循环语句 // while // do while // 这里的 i 是循环变量 一般初始值为0,因为下标从0开始 ...

  4. laravel——基础增删改查

    一.控制器代码 <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class CurdContro ...

  5. 将python中的一个float变量转成内存的4个字节值

    #coding=utf- from struct import pack,unpack byte=pack('f',1.5) print(byte) print([i for i in byte]) ...

  6. 解决IE11安装时需要“获取更新”(IE11离线安装)

    方法一:说明:目前是针对Windows7 64位操作系统安装! 1. 在C盘下新建文件夹,取名为“IE11”. 2. 将官网下载的IE11离线包放到此文件夹中. 3. win + r 打开运行窗口,输 ...

  7. 学习笔记74—函数argsort()

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  8. git命令合并分支代码

    对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢? 合并步骤:1.进入要合并的分支(如开发分支合并到master,则进入master目录)git checkout maste ...

  9. Redis(四)-持久化

    1.Redis将所有数据存储在内存中,从内存同步到磁盘上,就做持久化过程. 2.持久化有两种方式:rdb(Redis Database)和aof(Append of file) # rdb持久化方法: ...

  10. [大数据面试题]storm核心知识点

    1.storm基本架构 storm的主从分别为Nimbus.Supervisor,工作进程为Worker. 2.计算模型 Storm的计算模型分为Spout和Bolt,Spout作为管口.Bolt作为 ...