动态规划
今天来谈一谈我对动态规划的理解,我也是初学者,这里只是通过爬楼梯这道简单的问题,介绍一下动态规划的核心思想和基于这道题的 DP 分析
dp 思想
动态规划(一下简称 dp)是一种将多个阶段的问题分解成一系列单阶段问题,通过总结各阶段之间的关系得到所谓的状态转换方程,从而解决问题
dp 算法不同于二分、快排、双指针等算法,存在一个大致的模板,dp 问题因为问题要求不尽相同,推导 dp 方程的过程也不尽相同,但是我们还是可以总结一个答题流程,这里借鉴AcWing
闫学灿老师的闫氏 DP 分析法
通过爬楼梯问题来理解 dp
先看题目
题目
假设你正在爬楼梯,需要n
阶才能到达楼顶,每次你可以爬1
或2
个台阶,我们有多少种方法可以到达楼顶呢?(n
是一个整数)
dp 思路
dp 问题虽然没有固定的模板,但是我们可以根据经验总结出一个解题的思路,经过总结,我们认为 dp 问题分为状态表示和状态计算两步,我们依次说明
我们需要根据一个问题,抽象出一个结果的集合,假设为dp[i]
,它用来表示到达第 i 个台阶的方法数
,这是一个化整为零的过程,我们称为状态表示,dp[i]
所表示的含义我们称之为它的属性
随后,我们要通过总结dp[i]
的特点或者性质,给dp[i]
进行划分,这里划分的依据通常是寻找最后一个不同点,那么这个问题的划分点是哪里呢,很明显是还有1
步到第i
阶和还有2
步到第i
阶,这里划分时我们需要注意,我们划分的区间应该包含所有可能存在的情况,并且每个区间都会重复,划分后,我们要通过dp[i]
去表示两个区间,很简单,前者是dp[i - 1]
,后者是dp[i - 2]
,到这里,这道题的思路就很明确了,因为我们已经得到了它的 dp 方程:dp[i] = dp[i - 1] + dp[i - 2]
,我们只需要用代码来实现即可
代码
1 | int dp(int stairs) { |