nyoj 76-超级台阶 (递推)

76-超级台阶

内存限制:64MB
时间限制:1000ms
特判: No

通过数:8
提交数:12
难度:3

题目描述:

有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?

注:规定从一级到一级有0种走法。

输入描述:

输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40),  表示楼梯的级数。

输出描述:

对于每个测试实例,请输出不同走法的数量。

样例输入:

复制

2
2
3

样例输出:

1
2

分析:  1、第m阶的走法应该是前面m-1阶的走法 + 前面m-2阶的走法;  2、m-1的走法就表示最后只走一个台阶,m-2的走法表示最后上两个台阶;  PS:所以我们可以类推,如果最初有三种走法即就是上1、2、3阶,那么当前的走法 = f[m-1] + f[m-2] + f[m-3].

核心代码:  
1 for(int i = 4; i <= MAXN; ++ i)
2 {
3     f[i] = f[i-1] + f[i-2];
4 }

C/C++代码实现(AC):

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <map>
 8 #include <queue>
 9 #include <set>
10
11 using namespace std;
12 const int MAXN = 45;
13 int f[MAXN] = {0, 0, 1, 2};
14
15 void cal_excel()
16 {
17     for(int i = 4; i < MAXN; ++ i)
18         f[i] = f[i-1] + f[i-2];
19 }
20
21 int main()
22 {
23     int t;
24     cal_excel();
25     scanf("%d", &t);
26     while(t --)
27     {
28         int m;
29         scanf("%d", &m);
30         printf("%d\n", f[m]);
31     }
32     return 0;
33 }

原文地址:https://www.cnblogs.com/GetcharZp/p/9112672.html

时间: 2024-10-11 06:55:15

nyoj 76-超级台阶 (递推)的相关文章

NYOJ 76 超级台阶

#include<stdio.h>int a[50];int main(){ int num; scanf("%d",&num); while(num--) { a[1]=0; a[2]=1; a[3]=2; for(int i=4;i<50;i++) a[i]=a[i-1]+a[i-2]; int m; scanf("%d",&m); printf("%d\n",a[m]); }} // 简单动态规划

hdu 2041 超级楼梯(递推)

dp[i] = dp[i-1] + dp[i-2]    从第i-1阶跨1级上到第i阶 + 从第i-2阶跨2级上到第i阶 #include <iostream> #include <cstdio> using namespace std; int dp[50]; int main() { dp[2] = 1; dp[3] = 2; for( int i = 4; i <= 50; i++ ) dp[i] = dp[i-1] + dp[i-2]; int cas, n; sca

超级台阶 NYOJ 76

1 #include<stdio.h>//超级台阶(76) 2 #include<string.h> 3 int f(int x){ 4 int sum=0,i,a[45],t; 5 memset(a,0,sizeof(a)); 6 a[0]=1;a[1]=1; 7 for(i=0;i<x;i++){ 8 if(i>=2)a[i]=a[i-1]+a[i-2]; 9 sum=a[i]; 10 } 11 return sum; 12 } 13 int main() 14 {

一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式

是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) == f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) == f(n) = 2*f(n-1) 所以,可以得出递推式: 1 public static int jumpFloor(int n) { 2 if (n <= 0) 3 return 0; 4

(hdu step 3.1.1)超级楼梯(简单递推:从第1级到第m级有多少种走法,每次只能走一步或两步)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 超级楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 652 Accepted Submission(s): 483   Problem Description

算法学习——递推之超级素数

算法描述 超级素数定义: m位超级素数本身是素数 最高位开始,去掉一位为m-1位的素数-- 例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数 要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数 算法思路 设置一个判断素数的方法 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,

NYOJ 1076 方案数量(公式 或 递推)

方案数量 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给出一个N*M的棋盘,左下角坐标是(0,0),右上角坐标是(N,M),规定每次只能向上或者向右走,问从左下角走到右上角,一共有多少种方案.上图是一个4*3的棋盘. 输入 多组测试数据. 每组输入两个整数N,M(0≤N,M≤30). 输入0,0时表示结束,不做任何处理. 输出 对于每组测试数据,输出对应的方案数. 样例输入 4 3 2 2 0 0 样例输出 35 6 分析:这道题有2种做法. 一.推公式 ans

NYOJ——301递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值. 其中0<=f(1),f(2)<100,-100<=

[题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你一个 n 行m 列 的格子图 一只马从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行. 题意很简单暴力dp的思路也很简单但是数据很恶心虽然远古一点,但毕竟是省选题 1 ≤ n ≤ 50,2 ≤ m ≤ 10^9 不过还是给了我们一点提示:n这么小? 总之我们先找出转移式对于每一个点

hdu2089(数位DP 递推形式)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25802    Accepted Submission(s): 8967 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以