?
?
??四万字《画解动态规划》从入门到精通??
?
?
【摘要】 《画解动态规划》上
前言
??「 动态规划 」作为算法中一块比较野的内容,没有比较系统的分类,只能通过不断总结归纳,对各种类型进行归类。「 动态规划 」(即 Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学 以及 生物信息学中使用的,通过把原问题分解为相对简单的「 子问题 」的方式求解「 复杂问题 」的方法。??「 动态规划 」是一种算法思想:若要解一个给定问题,我们需要解其不同部分(即「 子问题 」),再根据「 子问题 」的解以得出原问题的解。要理解动态规划,就要理解 「 最优子结构 」 和 「 重复子问题 」。??本文将针对以下一些常用的动态规划问题,进行由浅入深的系统性讲解。首先来看一个简单的分类,也是今天本文要讲的内容。
直接跳到末尾 参与投票,获取粉丝专属福利。
一、递推问题
??递推问题作为动态规划的基础,是最好掌握的,也是必须掌握的,它有点类似于高中数学中的数列,通过 前几项的值 推导出 当前项的值。
1、一维递推
??你正在爬楼梯,需要 n n n 阶你才能到达楼顶。每次你可以爬 1 1 1 或 2 2 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
??假设我们已经到了第 n n n 阶楼梯,那么它可以是从 n ? 1 n-1 n?1 阶过来的,也可以是从 n ? 2 n-2 n?2 阶过来的(但是,不可能是从 n ? 3 n-3 n?3 阶直接过来的),所以如果达到第 n n n 阶的方案数为 f [ n ] f[n] f[n],那么到达 n ? 1 n-1 n?1 阶就是 f [ n ? 1 ] f[n-1] f[n?1],到达 n ? 2 n-2 n?2 阶 就是 f [ n ? 2 ] f[n-2] f[n?2],所以可以得出:
f [ n ] = f [ n ? 1 ] + f [ n ? 2 ] f[n] = f[n-1] + f[n-2] f[n]=f[n?1]+f[n?2]
??其中,当 n = 0 n=0 n=0 时方案数为 1,代表初始情况; n = 1 n=1 n=1 时方案数为 1,代表走了一步,递推计算即可。??以上就是最简单的动态规划问题,也是一个经典的数列:斐波那契数列 的求解方式。它通过一个递推公式,将原本指数级的问题转化成了线性的,时间复杂度为 O ( n ) O(n) O(n)。??C语言代码实现如下:
int f[1000];int climbStairs(int n){ f[0] = f[1] = 1; for(int i = 2; i = n; ++i) { f[i] = f[i-1] + f[i-2]; } return f[n];}
2、二维递推
??给定一个非负整数 n n n,生成杨辉三角的前 n n n 行。在杨辉三角中,每个数是它 左上方 和 右上方 的数的和。
??根据杨辉三角的定义,我们可以简单将上面的图进行一个变形,得到:
于是,我们可以得出以下结论:??1)杨辉三角的所有数可以存储在一个二维数组中,行代表第一维,列代表第二维度;??2)第 i i i 行的元素个数为 i i i 个;??3)第 i i i 行 第 j j j 列的元素满足公式:
c [ i ] [ j ] = { 1 i = 0 c [ i ? 1 ] [ j ? 1 ] + c [ i ? 1 ] [ j ] o t h e r w i s e c[i][j] = \begin{cases} 1 i=0\\ c[i-1][j-1] + c[i-1][j] otherwise \end{cases} c[i][j]={1c[i?1][j?1]+c[i?1][j]?i=0otherwise?
??于是就可以两层循环枚举了。时间复杂度为 O ( n 2 ) O(n^2) O(n2)。??C语言代码实现如下:
int c[40];void generate(int n) { for(int i = 0; i n; ++i) { for(int j = 0; j = i; ++j) { if(j == 0 || j == i) { c[i][j] = 1; }else { c[i][j] = c[i-1][j-1] + c[i-1][j]; } } }}
二、线性DP
1、最小花费
??数组的每个下标作为一个阶梯,第 i
您可能关注的文档
- 全球5G和新基建产业展望报告.docx
- 37个项目5G+智慧灯杆项目落地情况大汇总.docx
- ICPC程序设计竞赛(题目.终榜.总结).docx
- 河南省第十三届ICPC程序设计竞赛(题目.终榜.总结).docx
- 新基建拉动中国钢材消耗量显著提升.docx
- Serverless实践-构建无服务器的图片分类系统.docx
- StepsGuide-一个像跟屁虫一样的组件-DevUI.docx
- ES6原生实战Uploader工具类-从设计到实现.docx
- 信息安全数学基础复习笔记.docx
- 河北邢台市2025-2026学年高二上学期2月期末语文试题(含解析).docx
- 河北盐山中学等校2025-2026学年上学期高三一模化学试卷(含解析).docx
- 河北正定中学2025-2026学年高一上学期期末考试物理试卷(含解析).docx
- 河北张家口市怀安县2025-2026学年第一学期期末教学综合评价八年级地理试卷(含解析).docx
- 河南安阳市殷都区2025-2026学年第一学期期末教学质量检测七年级地理试卷(含解析).docx
- 河南安阳市滑县2025一2026学年第一学期期末学业质量监测八年级地理试题(含解析).docx
- 河南安阳市林州市2025-2026学年上学期期末考试高一政治试题(含解析).docx
- 河南焦作市武陟县第一中学2025-2026学年高一上学期1月月考语文试卷(含解析).docx
- 河南济源市2025-2026学年上学期期末学业质量调研七年级历史试卷(含解析).docx
- PICC导管并发症的紧急处理与护理.pptx
- 河南鹤壁市2025-2026学年高二上学期期末考试生物试题(含解析).docx
原创力文档

文档评论(0)