01

概念讲解

讲解动态规划的资料很多,官方的定义是指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。概念中的各阶段之间的关系,其实指的就是状态转移方程。很多人觉得DP难(下文统称动态规划为DP),根本原因是因为DP区别于一些固定形式的算法(比如DFS、二分法、KMP),没有实际的步骤规定第一步第二步来做什么,所以准确的说,DP其实是一种解决问题的思想

这种思想的本质是:一个规模比较大的问题(可以用两三个参数表示的问题),可以通过若干规模较小的问题的结果来得到的(通常会寻求到一些特殊的计算逻辑,如求最值等)

    所以我们一般看到的状态转移方程,基本都是这样:

opt :指代特殊的计算逻辑,通常为max or min。

i,j,k 都是在定义DP方程中用到的参数。

dp[i] = opt(dp[i-1])+1

dp[i][j] = w(i,j,k) + opt(dp[i-1][k])

dp[i][j] = opt(dp[i-1][j] + xi, dp[i][j-1] + yj, ...)

每一个状态转移方程,多少都有一些细微的差别。这个其实很容易理解,世间的关系多了去了,不可能抽象出完全可以套用的公式。所以我个人其实不建议去死记硬背各种类型的状态转移方程。但是DP的题型真的就完全无法掌握,无法归类进行分析吗?我认为不是的。在本系列中,我将由简入深为大家讲解动态规划这个主题。

我们先看上一道最简单的DP题目,熟悉DP的概念:

第70题:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2输出: 2解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:

输入: 3输出: 3解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

02

题目图解

通过分析我们可以明确,该题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建。满足“将大问题分解为若干个规模较小的问题”的条件。所我们令 dp[n] 表示能到达第 n 阶的方法总数,可以得到如下状态转移方程:

dp[n]=dp[n-1]+dp[n-2]

  • 上 1 阶台阶:有1种方式。

  • 上 2 阶台阶:有1+1和2两种方式。

  • 上 3 阶台阶:到达第3阶的方法总数就是到第1阶和第2阶的方法数之和。

  • 上 n 阶台阶,到达第n阶的方法总数就是到第 (n-1) 阶和第 (n-2) 阶的方法数之和。

03

Go语言示例

根据分析,得到代码如下:

 1func climbStairs(n int) int {2    if n == 1 {3        return 14    }5    dp := make([]int, n+1)6    dp[1] = 17    dp[2] = 28    for i := 3; i <= n; i++ {9        dp[i] = dp[i-1] + dp[i-2]
10    }
11    return dp[n]
12}

注:本系列所有教程中都不会用到复杂的语言特性,大家不需要担心没有学过go。算法思想最重要,使用go纯属本人爱好。同时,本系列所有代码均在leetcode上进行过测试运行,保证其严谨性!

温馨提示

浩仔讲算法~

每天一起学习图解漫画算法。

一起刷题,一起成长!

~长按下方二维码进行关注吧~

关注后有资源~

漫画:动态规划系列 第一讲相关推荐

  1. xgboost 正则项_XGBoost入门系列第一讲

    Boosted Trees 介绍 XGBoost 是 "Extreme Gradient Boosting"的简称,其中"Gradient Boosting"来 ...

  2. 【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive

    导读 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...

  3. Gradle系列第一讲-什么是Gradle? Gradle是做什么的?

      我之前一直都把Gradle理解为一个android studio工程的依赖管理和打包工具. 这么理解其实也没什么问题.但是这么理解不够全面和系统,会给我之后系统的使用gradle造成一定的限制.所 ...

  4. 【零基础】小声bb Java系列第一讲:Java简介与环境配置

    其实发布在公众号这个平台上的技术文并不少,涵盖计算机领域的各个方向,Linux啊,算法啊,python啊等等,但我发现,很多文章都是需要读者具有一定的编码基础才可以理解.学习的,对于那些对计算机领域感 ...

  5. 使用Android studio开发一个数独游戏APP 系列第一讲

    数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...

  6. 【转】阿里技术专家详解DDD系列 第二讲 - 应用架构

    填坑.谢谢大家对这个系列的期待,持续更新,欢迎关注此账号. 第一篇内容附地址: 阿里巴巴淘系技术:阿里技术专家详解 DDD 系列 第一讲- Domain Primitive​zhuanlan.zhih ...

  7. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    为什么80%的码农都做不了架构师?>>>    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影**<海王>**详细信息[电影名称.电影迅雷下载地址列表] ...

  8. 【直播回顾及资料下载】小程序云应用入门实操系列课程第一讲...

    直播详情:小程序云应用入门实操系列课程第一讲:https://yq.aliyun.com/articles/698244 直播时间:2019年4月16日 20:30 直播专家: 白宦成 - Linux ...

  9. 免费公开课 | AI对抗攻防系列专题,今晚7点第一讲

    精选6讲针对人脸识别的AI对抗专题课,搭配实战项目演练,完成项目作业即可获得完课奖品 近年来,AI安全问题愈加受到行业关注.在今年6月的智源大会上,清华大学计算机系教授.RealAI 首席科学家朱军就 ...

最新文章

  1. 安装mysql Install/Remove of the Service Denied!错误的解决办法
  2. 那么多MarkDown编辑器,最专业的还是这一款!
  3. redis系列:通过队列案例学习list命令
  4. SVN客户端与服务端安装详解
  5. QT_Qsplitter
  6. 【C#编程基础学习笔记】4---Convert类型转换
  7. Linux安装PHP curl拓展
  8. 时频分析方法及其在EEG脑电中的应用
  9. mouseenter、mouseleave、mouseover和mouseout的区别
  10. html转换txt文件,HTML网页转TXT文件、文本转换器_TxtEasy! V1.5.5 免费版
  11. 《未来世界的幸存者》:你会是未来世界的幸存者吗?
  12. mysql 金额大写_小写转大写金额_MySQL
  13. react-native-beacons-manager扫描beacons为空数组(android)--工作笔记
  14. 树莓派UFW防火墙简单设置
  15. 含论文基于SSH超市进销存管理系统【数据库设计、源码、开题报告】
  16. forward完美转发
  17. Matlab求矩阵的最小多项式
  18. 时间倒数计时器_如何建立倒数计时器
  19. 智能家居项目开发(一):简单工厂设计模式引入
  20. 《软件工程》知识点复习总结

热门文章

  1. ant design pro 修改logo图片名称位置
  2. 小米手机MIUI11带有3个实用小功能,与家庭相关,保护家人安全
  3. linux shell转义字符,linux shell 转义符
  4. Flutter 视频封面(含源代码)
  5. networkx 判断异质图同构
  6. .Net Core下自定义JsonResult
  7. 语音记事怎么操作?语音便签使用方法讲解
  8. 子苗教育:开通抖音小店有啥要求?
  9. Java Volatile变量说明与测试
  10. 金庸笔下的“程序员”