漫画:动态规划系列 第一讲
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上进行过测试运行,保证其严谨性!
温馨提示
浩仔讲算法~
每天一起学习图解漫画算法。
一起刷题,一起成长!
~长按下方二维码进行关注吧~
关注后有资源~
漫画:动态规划系列 第一讲相关推荐
- xgboost 正则项_XGBoost入门系列第一讲
Boosted Trees 介绍 XGBoost 是 "Extreme Gradient Boosting"的简称,其中"Gradient Boosting"来 ...
- 【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive
导读 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...
- Gradle系列第一讲-什么是Gradle? Gradle是做什么的?
我之前一直都把Gradle理解为一个android studio工程的依赖管理和打包工具. 这么理解其实也没什么问题.但是这么理解不够全面和系统,会给我之后系统的使用gradle造成一定的限制.所 ...
- 【零基础】小声bb Java系列第一讲:Java简介与环境配置
其实发布在公众号这个平台上的技术文并不少,涵盖计算机领域的各个方向,Linux啊,算法啊,python啊等等,但我发现,很多文章都是需要读者具有一定的编码基础才可以理解.学习的,对于那些对计算机领域感 ...
- 使用Android studio开发一个数独游戏APP 系列第一讲
数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...
- 【转】阿里技术专家详解DDD系列 第二讲 - 应用架构
填坑.谢谢大家对这个系列的期待,持续更新,欢迎关注此账号. 第一篇内容附地址: 阿里巴巴淘系技术:阿里技术专家详解 DDD 系列 第一讲- Domain Primitivezhuanlan.zhih ...
- java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
为什么80%的码农都做不了架构师?>>> 1. 目标 使用webmagic爬取动作电影列表信息 爬取电影**<海王>**详细信息[电影名称.电影迅雷下载地址列表] ...
- 【直播回顾及资料下载】小程序云应用入门实操系列课程第一讲...
直播详情:小程序云应用入门实操系列课程第一讲:https://yq.aliyun.com/articles/698244 直播时间:2019年4月16日 20:30 直播专家: 白宦成 - Linux ...
- 免费公开课 | AI对抗攻防系列专题,今晚7点第一讲
精选6讲针对人脸识别的AI对抗专题课,搭配实战项目演练,完成项目作业即可获得完课奖品 近年来,AI安全问题愈加受到行业关注.在今年6月的智源大会上,清华大学计算机系教授.RealAI 首席科学家朱军就 ...
最新文章
- 安装mysql Install/Remove of the Service Denied!错误的解决办法
- 那么多MarkDown编辑器,最专业的还是这一款!
- redis系列:通过队列案例学习list命令
- SVN客户端与服务端安装详解
- QT_Qsplitter
- 【C#编程基础学习笔记】4---Convert类型转换
- Linux安装PHP curl拓展
- 时频分析方法及其在EEG脑电中的应用
- mouseenter、mouseleave、mouseover和mouseout的区别
- html转换txt文件,HTML网页转TXT文件、文本转换器_TxtEasy! V1.5.5 免费版
- 《未来世界的幸存者》:你会是未来世界的幸存者吗?
- mysql 金额大写_小写转大写金额_MySQL
- react-native-beacons-manager扫描beacons为空数组(android)--工作笔记
- 树莓派UFW防火墙简单设置
- 含论文基于SSH超市进销存管理系统【数据库设计、源码、开题报告】
- forward完美转发
- Matlab求矩阵的最小多项式
- 时间倒数计时器_如何建立倒数计时器
- 智能家居项目开发(一):简单工厂设计模式引入
- 《软件工程》知识点复习总结