【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
创始人
2024-11-06 07:40:12
0

目录

写在前面:

题目:821. 跳台阶 - AcWing题库

题目描述:

输入格式:

输出格式:

数据范围:

输入样例:

输出样例:

解题思路:

方法一:暴力搜索

代码

方法二:记忆化搜索

代码

方法三:动态规划

 代码

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好动态规划,应对 “DP杯”。

事不宜迟,我们即刻开始刷题!

题目:821. 跳台阶 - AcWing题库

题目描述:

一个楼梯共有 n 级台阶,每次可以走一级或者两级,

问从第 0 级台阶走到第 n 级台阶一共有多少种方案。

输入格式:

共一行,包含一个整数 n。

输出格式:

共一行,包含一个整数,表示方案数。

数据范围:

1 ≤ n ≤ 15

输入样例:

5

输出样例:

8

解题思路:

这道题是一道经典的dp入门题目,

我打算使用三种方法去做,层层推进,一起入门递归:

方法一:暴力搜索

这道题在之前dfs的刷题中也有出现,

我们可以用dfs搜索所有的方案:

跳三级台阶就是跳两级台阶的方法+跳一级台阶的方法;

跳四级台阶就是跳三级台阶的方法+跳二级台阶的方法;

以此类推: 

最后得出答案:

代码如下:

代码

#include  #include  #include  #include   using namespace std;  int n = 0;  int dfs(int u) {     if(u == 1) return 1;     else if(u == 2) return 2;          return dfs(u - 1) + dfs(u - 2); }  int main() {     scanf("%d", &n);     int res = dfs(n);     printf("%d", res);     return 0; } 

方法二:记忆化搜索

实际上第一种方法的时间复杂度太高,

有2的n次方那么大:

如果n >= 42,就会超时:

 

为了减少时间的消耗,我们可以用记忆化搜索:

将已经求过的值记录到一个数组中,

这样搜索过的值就不用重复搜索:

 下面是代码实现:

代码

#include  #include  #include  #include   using namespace std;  int n = 0; int sum = 0; const int N = 30; int mem[N];//用一个数组记录  int dfs(int u) {     if(mem[u]) return mem[u];//如果记录过,就不用往下搜索了          if(u == 1) return 1;     else if(u == 2) return 2;     else sum = dfs(u - 1) + dfs(u - 2);          mem[u] = sum;//将该位置的值记录进数组     return mem[u]; }  int main() {     scanf("%d", &n);     int res = dfs(n);     printf("%d", res);     return 0; } 

我们发现这样之后,就算n = 100,也只需要1ms:

方法三:动态规划

我们发现,其实这道题动态规划的

状态表达式就是由暴力搜索推出来的,

递归搜索是从上往下搜索,

再从下往上回溯,

其实得出的结果的过程就是在回溯的时候:

那我们可以不用搜索这个过程,直接从下往上递推,

这就是动态规划:

下面是代码实现:

 代码

#include  #include  #include  #include   using namespace std;  int n = 0; const int N = 30; int fib[N];  int main() {     scanf("%d", &n);          fib[1] = 1;     fib[2] = 2;          if(n == 1 || n == 2)     {         printf("%d", fib[n]);         return 0;     }          for(int i = 3; i <= n; i++)     {         //这个就是动态规划的状态表达式         fib[i] = fib[i - 1] + fib[i - 2];     }     printf("%d", fib[n]);      return 0; } 

AC !!!!!!!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

相关内容

热门资讯

透视黑科技!wepoker钻石... 透视黑科技!wepoker钻石怎么看底牌(透视)从来有挂(详细辅助系统教程);1分钟了解详细教程(微...
透视脚本!wepoker免费永... 透视脚本!wepoker免费永久脚本(透视)详细辅助透明挂教程(一直真的有挂)1、在wepoker免...
透视科技!aapoker透视怎... 透视科技!aapoker透视怎么用,德普软件(详细辅助必胜教程)aapoker透视怎么用软件透明挂微...
透视规律(wePOKE)wep... 透视规律(wePOKE)wepower让系统发好牌(透视)详细辅助分享教程关于wepower让系统发...
透视最新!aapoker能控制... 1、透视最新!aapoker能控制牌吗(透视)原来有挂(详细辅助大神讲解);详细教程。2、aapok...
透视辅助!aapoker辅助是... 透视辅助!aapoker辅助是真的吗,werplan怎么透视(详细辅助介绍教程)1、下载好aapok...
透视实锤!wpk辅助器安装(透... 透视实锤!wpk辅助器安装(透视)详细辅助微扑克教程(一直有挂)1、全新机制【wpk辅助器安装软件透...
透视透视(WePoKer)wp... 透视透视(WePoKer)wpk发牌算法(透视)详细辅助介绍教程;支持2-10人实时对战,虚拟庄家发...
透视工具!拱趴大菠萝辅助神器(... 透视工具!拱趴大菠萝辅助神器(透视)果然真的有挂(详细辅助细节方法);支持2-10人实时对战,虚拟庄...
透视透视!智星德州菠萝插件官网... 透视透视!智星德州菠萝插件官网,智星德州插件2024最新版(详细辅助黑科技教程);1、实时智星德州菠...