9.1 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一个方法,计算小孩有多少种上楼梯的方法。

解法:

我们可以采用自上而下的方式来解决这个问题。小孩上楼梯的最后一步,也就是抵达第n阶的那一步,可能走1阶、2阶或3阶。也就是说,最后一步可能是从第n-1阶往上走1阶、从n-2阶往上走2阶,或从第n-3阶往上走3阶。因此,抵达最后一阶的走法,其实就是抵达这最后三阶的方式的总和。

递归的方法实现:

int countWaysD(int n)
{
if(n<)
return ;
else if(n==)
return ;
else
{
return countWaysD(n-)+countWaysD(n-)+countWaysD(n-);
}
}

使用3个临时变量的方法:

int countWays(int n)
{
if(n<)
return ;
if(n==)
return ;
int first=,second=,third=;
int i=;
int ret;
while(i<=n)
{
ret=first+second+third;
first=second;
second=third;
third=ret;
i++;
}
return ret;
}

使用dp的方法,需要一个数组来记录前面已经求出的值。

int countWaysDP(int n,int dp[])
{
if(n<)
return ;
if(n==)
return ;
if(dp[n]>)
return dp[n];
else
dp[n]=countWaysDP(n-,dp)+countWaysDP(n-,dp)+countWaysDP(n-,dp);
return dp[n];
}

C++实现代码:

#include<iostream>
#include<cstring>
#include<climits>
using namespace std; const int MAX=; int countWaysD(int n)
{
if(n<)
return ;
else if(n==)
return ;
else
{
return countWaysD(n-)+countWaysD(n-)+countWaysD(n-);
}
}
int countWays(int n)
{
if(n<)
return ;
if(n==)
return ;
int first=,second=,third=;
int i=;
int ret;
while(i<=n)
{
ret=first+second+third;
first=second;
second=third;
third=ret;
i++;
}
return ret;
} int countWaysDP(int n,int dp[])
{
if(n<)
return ;
if(n==)
return ;
if(dp[n]>)
return dp[n];
else
dp[n]=countWaysDP(n-,dp)+countWaysDP(n-,dp)+countWaysDP(n-,dp);
return dp[n];
} int main()
{
int dp[MAX]={};
for(int i=; i<; i++)
cout<<countWays(i)<<endl;
}

careercup-递归和动态规划 9.1的更多相关文章

  1. 70. Climbing Stairs【leetcode】递归,动态规划,java,算法

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  2. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  4. 面试题目——《CC150》递归与动态规划

    面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...

  5. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  6. Idea 02.暴力递归与动态规划(1)

    1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...

  7. scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  8. OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划

    一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...

  9. 递归,动态规划,找最短路径,Help Jimmy

    题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...

  10. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10

    2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...

随机推荐

  1. Java异常处理之throws抛出异常

    package com.test; import java.io.FileReader; public class Test2 { public static void main(String[] a ...

  2. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-003- 上传文件multipart,配置StandardServletMultipartResolver、CommonsMultipartResolver

    一.什么是multipart The Spittr application calls for file uploads in two places. When a new user register ...

  3. datetime 和 smalldatetime

    用于表示某天的日期和时间的数据类型. datetime 和 smalldatetime 表示某天的日期和时间. 数据类型 范围 精确度 datetime 1753 年 1 月 1 日到 9999 年 ...

  4. BZOJ2351: [BeiJing2011]Matrix

    2351: [BeiJing2011]Matrix Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 171[Submit][S ...

  5. "is not on any development teams " Xcode的账号错误问题

    "***@*** is not on any development teams " Xcode现在在"Accounts"中时不时会出现这个提示. 但其他按钮都 ...

  6. 注意!ASP.NET MVC 3 的一个 OutputCache 问题

    在用 ASP.NET MVC 3 重写博客园网站首页时,特地留意了一下这个缓存问题,通过这篇博文分享一下. 在 ASP.NET MVC 3 中如果使用了 OutputCache,一定要在 Action ...

  7. ASP.NET MVC3细嚼慢咽---(3)Razor视图语法

    MVC3.0中新增加了Razor视图,Razor视图的语法以@符号为核心,貌似在这个时代离不开@了,微博,邮箱都用这个. 1.输出变量和文本 @DateTime.Now @for (int i = 0 ...

  8. 嵌入式开发软件环境:uboot、kernel、rootfs、data布局分析

    uboot+linux的整体方案 开发板的datasheet中都有详细的地址空间的划分,其中比较重要的两块是:DDR地址空间和Flash地址空间.DDR空间是系统和应用的运行空间,一般由linux系统 ...

  9. 五指CMS v1.2 GBK 发布下载

    五指CMS v1.2 GBK 版本下载地址: http://www.wuzhicms.com/uploadfile/wuzhicms/wuzhicms-v1.2.zip       从内测到公测,五指 ...

  10. vijosP1447 开关灯泡

    vijosP1447 开关灯泡 链接:https://vijos.org/p/1447 [思路] 数学+高精度. 分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多 ...