动态规划(一)——从爬楼梯问题简单理解dp

动态规划

​ 今天来谈一谈我对动态规划的理解,我也是初学者,这里只是通过爬楼梯这道简单的问题,介绍一下动态规划的核心思想和基于这道题的 DP 分析

dp 思想

​ 动态规划(一下简称 dp)是一种将多个阶段的问题分解成一系列单阶段问题,通过总结各阶段之间的关系得到所谓的状态转换方程,从而解决问题

​ dp 算法不同于二分、快排、双指针等算法,存在一个大致的模板,dp 问题因为问题要求不尽相同,推导 dp 方程的过程也不尽相同,但是我们还是可以总结一个答题流程,这里借鉴AcWing闫学灿老师的闫氏 DP 分析法

通过爬楼梯问题来理解 dp

​ 先看题目

题目

​ 假设你正在爬楼梯,需要n阶才能到达楼顶,每次你可以爬12个台阶,我们有多少种方法可以到达楼顶呢?(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],我们只需要用代码来实现即可

代码

int dp(int stairs) {
    if (stairs == 1)
        return 1;
    int dp[stairs + 1];
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= stairs; ++i) dp[i] = dp[i - 2] + dp[i - 1];
    return dp[stairs];
}
发布了72 篇原创文章 · 获赞 89 · 访问量 6516

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/105084237
今日推荐