目录
前言
拖鞋言:不得不说,我可真是个废物。算法从去年四月开始接触,期间一直走走停停。几乎没学到什么实在的东西。壮志凌云地报名了蓝桥杯,但到此为止却并无实际进展。接下来计划静下心来好好研究算法,并持续高质量记录学习过程。祝顺利~
此篇文章是跟随下面视频学习的笔记。up使用 dfs暴力 --> 记忆化搜索 --> 递推 的思路来给我这种小白讲动态规划,我觉得真的很妙。推荐观看。动态规划(dp)入门 | 这tm才是入门动态规划的正确方式! | dfs记忆化搜索 | 全体起立!!_哔哩哔哩_bilibili
跳台阶
问题:一次可以跳上1级台阶,也可以跳上2级。求该跳上一个n级的台阶总共有多少种跳法。
这个问题看似简单,其实并不那么容易理解。拖鞋起初学习裴波那契 接触它的时,也死活理解不了。
问题思路:从问题里,首先我们不难知道,如果只有一级台阶,那么只有一种方案,即只走一步。如果只有两级台阶,我们也很快分析出来只有两种方案,即直接跳两级,或是一级一级来。那么有三级台阶时,首先我们会面临一个选择。第一步,是走一级,还是走两级。如果我们第一步走一级,那么就剩下两级,这剩下的两级我们可以直接两步跨完,也可以一级一级走。“可以直接两步跨完,也可以一级一级走”这句话是不是有些熟悉,也就是只有两级台阶时,我们的处理方法。也就是说三级台阶问题可以被我们分解成一级+两级台阶问题。(此处可能依旧会有朋友不能理解,可以去看看别的文章的解释,或许慢慢就能明白了。)而四级台阶,也会面临选择。第一步是走一级,还是两级。倘若走两级,那么就剩下两级(又变成了只有两级台阶的问题)。倘若走一级,则剩下三级,是只有三级台阶的问题(而上面我们又将三级台阶,分成了一级+二级台阶的问题)。有点小饶,但此时我们可以发现有点像套娃,大问题会变成小问题,最终会有一个已知值。
使用dfs暴力算法的方法解答如下:
#include<stdio.h>
int dfs(int n)
{
if(n==1) return 1; //一级台阶时
else if(n==2) return 2; //两级台阶时
else return dfs(n-1)+ dfs(n-2);