动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。
ok,这是百度百科给出的定义。这个定义写的太过抽象,我反正是看不懂。

虽然我觉得你们个个专业 英语八级,但是为了卖弄我的英语水平,我还是翻译一下
Those who cannot remember the past are condemned to repeat it. - George Santayana
“不能铭记历史的人注定要重蹈覆辙。”

writes down “1+1+1+1+1+1+1+1 =” on a sheet of paper
“What’s that equal to?”
counting “Eight!”
writes down another “1+” on the left
“What about that?”
quickly “Nine!”
“How’d you know it was nine so fast?”
“You just added one more”
“So you didn’t need to recount because you remembered there were eight! Dynamic Programming is just a fancy way to say ‘remembering stuff to save time later’”.

A “1+1+1+1+1+1+1+1 =?” *
A : “上面等式的值是多少”
B : 计算 “8!”
A 在上面等式的左边写上 “1+” *
A : “此时等式的值为多少”
B : quickly “9!”
A : “你怎么这么快就知道答案了”
A : “只要在8的基础上加1就行了”
A : “所以你不用重新计算因为你记住了第一个等式的值为8!动态规划算法也可以说是 ‘记住求过的解来节省时间’”

以上两段即可阐述动态规划的核心思想了:记住已经解决的子问题的解。

按照定义说的,动态规划是将大问题分解成子问题。这个定义当然没有任何毛病,但这肯定不是动态规划的核心思想呀。我就问:什么大问题不能分解成多个子问题?
关键在于:记住这些小问题的解。
我举个简单的例子。
小明爬楼梯(小明脑子一定是有问题的),他要爬十层楼梯。那么请问他一共有几种爬上去的办法呢(假设其每次可跨一层或者二层楼梯)?

你看着图,我们就把问题转化成了0走到10有几种走法了嘛
我就问:如果我们计算了7到10的走法,路径数是不是就可以保存下来。不管5走过来还是6走过来,7到10的走法是通用的对吧。这就是问题的本质了。计算后保存而不是重复计算。
ok,talk is cheap,show me the code。
让我们刷题leetcode冷静一下

给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
说明:s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:输入:
s = "aa"
p = "a*"
输出: true
解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
示例 3:输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
示例 5:输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
class Solution(object):def isMatch(self, s, p):""":type s: str:type p: str:rtype: bool"""dp=[[False  for i in range(len(p)+1)] for j in range(len(s)+1)]dp[0][0]=Truefor j in range(1,len(p)+1):dp[0][j]=((j>=2) and dp[0][j-2] and p[j-1]=="*")#s是空串的情况for i in range(1,len(s)+1):for j in range(1,len(p)+1):if p[j-1]=='*':dp[i][j]=dp[i][j-2] or (dp[i-1][j] and(s[i-1]==p[j-2] or p[j-2]==".")) else:dp[i][j]=dp[i-1][j-1] and (s[i-1]==p[j-1] or p[j-1]==".")return dp[len(s)][len(p)]

快速理解算法之动态规划相关推荐

  1. python 傅里叶变换_理解快速傅里叶变换算法

    翻译自原文:https://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/ ​ 快速傅里叶变换(FFT)是信号处理和数据分析中最重要的 ...

  2. 快速幂算法及其在动态规划中的应用(矩阵幂)

    文章目录 一.快速幂算法引入 二.快速幂算法 三.快速幂算法在矩阵幂中的运算 四.LeetCode1220的快速幂做法 五.参考资料 一.快速幂算法引入   假如我们有一个需要求2^100的后三位的问 ...

  3. 01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

    0-1背包问题 所谓0-1背包问题,也就是给你一个重量为M的背包和n种物品,每种物品有一定的重量和价值,在每种物品均可装入背包1次或不装入(不能仅装入物品的一部分)且不超过背包载重量的前提下,问你怎样 ...

  4. 机器阅读理解算法集锦

    机器阅读理解算法集锦   机器阅读理解(Machine Reading Comprehension, MRC) 是一项基于文本的问答任务(Text-QA),也是非常重要和经典的自然语言处理任务之一.机 ...

  5. python 快速行进 算法 图像修补

    图像修复 很多时候遇到受损的图片我们需要利用机器视觉的手段对其进行修复,opencv中提供了inpaint函数实现了这一功能. 1.先来看一个例子 首先读入图片: import numpy as np ...

  6. IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议

    1.前言 IM应用从服务端数据的角度来看,它是一种很特殊的应用场景,抛开基础数据.增值业务和附属功能不谈,单从IM聊天工具的立身之本--聊天数据来说,理论上是不需要在服务端存储的(或者说只需要短暂存储 ...

  7. Bellman-Ford 算法 和 动态规划

    Floyd算法: 状态: d[k][i][j]定义:"只能使用第1号到第k号点作为中间媒介时,点i到点j之间的最短路径长度." 动态转移方程: d[k][i][j]=min(d[k ...

  8. 你必须掌握的,快速幂算法

    文章目录 1. 使用快速幂算法实现Pow(x,n) 2. 快速幂取余 1. 使用快速幂算法实现Pow(x,n) 求x的n次方,可以使用暴力解法,这种算法时间复杂度为O(n),并且,当x和n比较大的时候 ...

  9. LeetCode50——一题学会快速幂算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的第31篇文章,我们来看下LeetCode的第50题,求一个数的幂. 题意 这道题的题意只有一句话,就是给定两个数x和 ...

最新文章

  1. opencv c++ 寻找矩形框_基于Python的OpenCV人脸检测!OpenCV太强了!
  2. vim 打开Linux下文件每一行后面都有^M的样式
  3. eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能
  4. Intellij IDEA中使用Protobuf的正确姿势
  5. Linux下给挂载U盘或者SD卡
  6. CTFshow php特性 web125
  7. java.util.concurrent介绍【转】
  8. Topk 问题详解及代码和数据分析
  9. ARIMA模型之疏系数模型
  10. 微课|中学生可以这样学Python(例8.21):选择法排序
  11. 快速排序-超级详细代码注释!
  12. c# key event
  13. Spring Boot 中使用WebJars引入javasript依赖
  14. 2022版保姆级Idea调试jdk源码
  15. Mybatis001_JDBC
  16. vue中的观察者模式
  17. 串口通信原理详解232、422、485
  18. C#与C/C++的交互
  19. 2018-2019年世界将会出现一场经济危机,危机过后中国将会崛起!
  20. 也来谈谈函数返回引用 int fun(int x);

热门文章

  1. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL
  2. 魔兽争霸3游戏改键原理
  3. 网站设为首页,加入收藏夹
  4. winmgmt.exe-应用程序错误
  5. C#常用基础知识总结(B/S和C/S的异同属于个人整理)
  6. Google Ads 政策所禁止的广告类型
  7. 时间无情流逝,同学有情长存
  8. object detection API完整配置教程
  9. godot 中文教程有了!
  10. 1.11 日本蜡烛图技术之头肩线和K线环境分析