动态规划--上楼梯

题目:假设你需要进入一个房间,但是房间在楼上,你需要走完n阶台阶,才能到楼上,如果你一次性可以走1、2或3个台阶,可以计算出你一共有多少种方案去走完所有的台阶进入房间呢?

解题思路:定义一个状态函数f(n)用来表示如果要走n阶台阶一共可以有方案数量,则f(n)=f(n-1)+f(n-2)+f(n-3)。当n=1时只有一中方案,当n=2时有两种方案(1,1;2),当n=3时有4种方案(1,1,1;1,2;2,1;3),依次类推。

具体算法(Java版)

 1 /**
 2  * 计算n个台阶一共有多少中走法
 3  */
 4 public class Step {
 5
 6     public static int walk(int n, int[] stepWays) {
 7         if (n <= 0)
 8             return 0;
 9         int count = 0;
10         for (int i = 0; i < stepWays.length; i++) {
11             if (n == stepWays[i]) {
12                 count += 1;
13             } else {
14                 count += walk(n - stepWays[i], stepWays);
15             }
16         }
17         return count;
18     }
19
20     public static void main(String[] args) {
21         int[] stepWays = new int[] { 3, 1, 2};
22         int n = 10;
23         System.out.println(walk(n, stepWays));
24     }
25
26 }

如果有什么问题,可以一起交流!

时间: 2024-12-14 20:39:26

动态规划--上楼梯的相关文章

9.9递归和动态规划(一)——小孩上楼梯的方式的种类

/** * 功能:有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶或3阶.计算小孩上楼梯的方式有多少种. */ 两种方法: 方法一: //递归法 /** * 思路:自上而下的方式. * 最后一步可能是从第n-1阶往上走1阶.从第n-2阶往上走2阶或从第n-3阶往上走3阶. * 因此,抵达最后一阶的走法,抵达这最后三阶的方式的综合. * @param n * @return */ public static int countWays(int n){ if(n<0) return 0;

上楼梯

题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数.保证n小于等于100000. 测试样例: 1 返回:1 class GoUpstairs { public: int countWays(int n) { // write code here int a[100000]; for(int i=0;i<=100000;

初学LUA—实现上楼梯算法

题目:楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法. 要求是使用递归和迭代两种不同的方法来实现.对于我这个算法又渣也没接触过LUA的人来说,真是有点脑子不够用了!! ' 捣鼓了一整天,了解LUA语法,各种google百度,暂且只能弄出递归解法,至于迭代,还得好好理解理解! --递归 function walkStairs(remainingSteps,currentSteps) if remainingSteps<=2 then printWalkWays(rem

JUMP上楼梯游戏IOS源码

基于cocos2d-x的简单JUMP上楼梯游戏,配有音效.适合新接触cocos2d的同学学习.规则类似 “是男人就上100层”的经典小游戏,就是控制宝宝通过跳上不同高度的踏板而慢慢升高. <ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-1711-1-1.html

18.上楼梯

题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数.保证n小于等于100000. 测试样例:1 返回:1代码如下: import java.util.*; public class GoUpstairs { public int countWays(int n) { int n1=1; int n2=2; int n3

解题(GoUpstairs -- 上楼梯)

题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数.保证n小于等于100000. 测试样例: 1 返回:1 代码如下: 1 2 3 4 //对于上k级台阶,当k>3时,由于每次可以上1,2,3级,则最后一次应该是上1,2,3中的一个 5 //case1,最后一次上1级,也即前面上了k-1级,k-1级的可能情况为:A[k

递归----小白上楼梯

题目:小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式. 思路:这种题目一般从最后结果入手,逆推,假如小白已经在最顶端,那么有f(n)种方式走完所有楼梯,有f(n-1)种方式走完倒数第一个楼梯,有f(n-2)种方式走完倒数第二个楼梯,有f(n-3)种方式走完倒数第三个楼梯.那么递推公式为f(n)=f(n-1)+f(n-2)+f(n-3). 代码: import java.util.Scanner; public class 小白上楼梯

上楼梯问题(递归C++)

[问题描述] 小明上楼梯,一次可以迈1步,2步和3步,假设楼梯共有n个台阶,输出他所有的走法. [代码展示] #include<iostream>using namespace std;int a[100];void louti(int index,int n){ //递归边界:满足条件则输出行走步数 if(n==0){ for(int i=0;i<index;i++){ cout << a[i] << " "; } cout <<

动态规划走楼梯问题

有一条楼梯,总共有9级阶梯,从地面上出发,如果每次可以走3级,4级或6级楼梯,问共有几种方案可以走到? 解决方案一: 第一个方法比较简单,很容易想到,就是用深度搜索,我们可以反过来,把情况看出从第9层阶梯走到路面,把所有可以出现的情况都列出来,然后判断是否能到达第9级阶梯,如果可以,就把方案数加一. 代码如下: public class DPStair { static int count=0; //计算F(n)被调用了计次 static int F(int n) { count++; if(n