赛码网算法: 上台阶 ( python3实现 、c实现)

上台阶                           题目描述               有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法。                  输入输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。样例输入223输出对于每个测试实例,请输出不同走法的数量。样例输出12时间限制C/C++语言:2000MS其它语言:4000MS  内存限制C/C++语言:65537KB其它语言:589825KB

在赛码网做算法题,遇到这样一个问题。

虽然我还很一般,还需要继续进步,但是希望能够记录下学习的新知识。把握自己的思想写下来,提供给没有想法的伙伴们一个参考~

代码捉襟见肘,还请见谅~

这是一个动态规划问题。动态规划的特点是,一个庞大的问题我们可以把它分成多个阶段,每个阶段得到一个结果作为下一个阶段的开始。  但是每个阶段都有多种可能性,每一种决策会影响当前的结果但是对下一阶段是没有影响的,阶段之间相互独立,只选择决策自己。

下面说一下我的思路:

当前我们站在1台阶 输入一个m 代表目标台阶1 如果m是1 则 答案是02 如果m是2 则答案是 1  只有一种可能, 1步上去3 如果m是3 则答案是 3  两种可能:1+1;2

4 如果m是4  有两种情况到达4 从2迈2台阶到4; 从3迈1台阶到4, 从1到2或者3 之前我们计算过了 所以 我们把这两种情况加在一起5 如果m是5  有两种情况到达4 从3迈2台阶到5; 从4迈1台阶到5; 从1到4或者3 之前我们计算过了 所以 我们把这两种情况加在一起......之后都是一样的,我们从一开始往后推算,任何一个台阶都可以从上一个台阶迈1台阶   或者 上两个台阶 迈两个台阶过来,从1台阶到 前一台阶或者前两台阶都计算过。

这就是很典型的动态规划算法的思想了:请看代码,python3版本:
 1 #coding:utf8
 2 def count(steps):
 3     if steps == 1:
 4         return 0
 5     if steps == 2:
 6         return 1
 7     if steps == 3:
 8         return 2
 9     return count(steps -1) + count(steps -2)
10 if __name__ == ‘__main__‘:
11     m = int(input())
12     for i in range(m):
13         n = int( input() )
14         print( count(n) )

鉴于python的使用量还不够庞大,我又用c写了一遍相同的实现。

C语言版本:
 1 int count( steps ){
 2     if( steps == 1 ) return 0;
 3     if( steps == 2 ) return 1;
 4     if( steps == 3 ) return 2;
 5     return count(steps -1 )+ count(steps -2);
 6 }
 7 int main(){
 8     int n,m;
 9     scanf("%d",&n);
10     while( n-- ){
11         scanf("%d",&m);
12         printf("%d\n",count(m));
13     }
14     return 0;
15 }

这两种语言实现相同的思想。不用纠结哪种语言。

不过单纯来看这道题,运用动态规划算法据说还不是最优解,听数学系的同学说,斐波那契数是最快的方式。

我不理解斐波那契为什么可以,所以我也没有用。

写下动态规划的代码,学习一下动态规划的思想,还是有意义的!

能力一般~~请多包涵~

				
时间: 2024-10-15 10:09:03

赛码网算法: 上台阶 ( python3实现 、c实现)的相关文章

赛码网算法:认老乡

最近在赛码网上做算法题,看到这样一道题,经过不断的学习,最后解决了.把我的思想和代码给大家分享一下~ 认老乡 题目描述大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷.但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗? 输入每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*

赛码网算法: 格子游戏

格子游戏 题目描述 有n个格子,从左到右放成一排,编号为1-n.共有m次操作,有3种操作类型:1.修改一个格子的权值,2.求连续一段格子权值和,3.求连续一段格子的最大值.对于每个2.3操作输出你所求出的结果. 输入输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开:接下来输入n行,每行一个整数表示一个格子的权值接下来输入m行,每行有三个整数,中间用空格隔开:第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号.样例输入3 37892 1 33 1 32 1 2输

赛码网的一道百度编程题

最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例.目前给的通过率是83% 题目如下: 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大.她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z.之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ.之后则是三位.四位.五位--字母编号的,规则类似. 表格单

赛码网 5.12周考

本来都不想写下去了,后来想想,还是写写吧!以后回过头来看看,就可以说,哦,那些时间去做这个了! 下面步入正题. 赛码网 5.12周考 题目挺难的,反正我2道题目都没有做出来,官网上也没有贴出来答案,就只好自己去找了. 1. 暴力搜索肯定是不行的,时间复杂度很高,只好找一种数个数的方法,没有想到. 题解链接:http://krydom.com/bzoj1801/ 解释的应该很详细,但是我有一点疑问, 放2个到一个空列上 与 放一个到只有一个的列上,另一个放到空列上, 这两种的转移方式 应该是不同的

赛码网-1

公交车乘客 题目描述 一个公交车经过n个站点,乘客从前门上车,从后门下车. 现在统计了在第i个站,下车人数a[i],以及上车人数b[i]. 问公交车运行时候车上最多有多少乘客 输入 第一行读入一个整数n(1<=n<=100),表示有n个站点 接下来n行,每行两个数值,分别表示在第i个站点下车人数和上车人数 样例输入 4 0 3 2 5 4 2 4 0 输出 每组输出车上最多的乘客数目 样例输出 6 时间限制 C/C++语言:1000MS其它语言:3000MS 内存限制 C/C++语言:6553

【JavaScript】赛码网前端笔试本地环境搭建

参考:https://hoofoo.me/article/2017-04-11/%E8%B5%9B%E7%A0%81%E7%BD%91%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AF%95%E6%9C%AC%E5%9C%B0%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html print方法的实现 这个没有什么难度,只是把console.log改个名字的事情,一行代码就可以解决. var print = console.log read_line方

赛码网-研究生考试

研究生考试 题目描述 欢迎大家参加奇虎360 2016校招在线招聘考试,首先预祝大家都有个好成绩! 我相信参加本次在线招聘考试的有不少研究生同学.我们知道,就计算机相关专业来说,考研有4门科目,分别是政治(满分100分),英语(满分100分),数学(满分150分)和专业课(满分150分). 某校计算机专业今年录取研究生的要求是:政治.英语每门课成绩不低于60分,数学和专业课不低于90分,总成绩不低于310分.并且规定:在满足单科以及总成绩最低要求的基础上,350分以上(含350分)为公费(Gon

赛码网-约会

约会 题目描述 Bob和Alice有个约会,一大早Bob就从点(0,0)出发,前往约会地点(a,b).Bob没有一点方向感,因此他每次都随机的向上下左右四个方向走一步.简而言之,如果Bob当前在(x,y),那么下一步他有可能到达(x+1,y), (x-1,y), (x,y+1), (x,y-1).很显然,当他到达目的地的时候,已经很晚了,Alice早已离去.第二天,Alice质问Bob为什么放她鸽子,Bob说他昨天花了s步到达了约会地点.Alice怀疑Bob是不是说谎了.你能否帮她验证一下? 输

1、谁是幸运儿--赛码网周考(0609)

时间限制:C/C++语言 2000MS:其他语言 4000MS 内存限制:C/C++语言 65536KB:其他语言 589824KB 题目描述: 小A是某公司的员工,在一次公司年会上,主持人宣布进行一项游戏来活跃年会气氛,游戏规则如下:n个人随机站成一排,按照他们所站的顺序依次给他们编号从1到n,接下来就从编号为1的人开始,按从左到右的顺序每隔一人选出一个人,选出的这些被淘汰,剩下的需要重新站成一排,其中首尾是接龙的,即如果倒数第二个被淘汰,则隔一人即第一个人被淘汰,如此循环一直到最后剩下两个人