careercup-递归和动态规划 9.1
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的更多相关文章
- 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 ...
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 面试题目——《CC150》递归与动态规划
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...
- python---通过递归和动态规划策略解决找零钱问题
也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...
- Idea 02.暴力递归与动态规划(1)
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...
- scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 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开 ...
- 递归,动态规划,找最短路径,Help Jimmy
题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...
随机推荐
- HLS协议实现
http://blog.csdn.net/wutong_login/article/details/9673255
- 如何忽略usb host 模式设备连接确认对话框
<li class="alt"><span><span>package android.hardware.usb; </span> ...
- 释放SQL Server占用的内存
由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),Sql Server才会释放一点点内存.所以很多时候,我们会发现运行Sql Server ...
- 161. One Edit Distance
题目: Given two strings S and T, determine if they are both one edit distance apart. 链接: http://leetco ...
- git workflow 原文 以及缺点
原文链接 http://nvie.com/posts/a-successful-git-branching-model/ 有人发现git work flow的缺点,历史提交会变得混乱 http://e ...
- WPF——菜单栏及TabControl
一.先造一个窗体,然后在窗体里面增加菜单栏及原始的TabControl选项卡 <Grid> <Menu> <MenuItem Header="文件" ...
- javascript--苹果系统底部菜单--详细分析(转)
源码下载:http://pan.baidu.com/s/1hqvJJA8 代码来源: 这个DEMO来自“妙味课堂” 昨天看到了“妙味课堂”的一个苹果菜单的DEMO.根据里面提到的“勾股定理”.我自己分 ...
- ArrayList源码解析
ArrayList简介 ArrayList定义 1 public class ArrayList<E> extends AbstractList<E> implements L ...
- tcxtreelist 控制单元格变颜色,或者行变颜色
如果控制单元格变颜色,只需要把注释的放开就可以了, 也就是判断当前列,是否是你想让变颜色的列. 如果想整行变颜色, 则只需要注释下面的就可以了. procedure TfrmwpOrderSendin ...
- cocos2d-x android项目引用so库编译
项目接了几十个渠道平台,每个平台都建了一个Android工程,引用Classes,由于才用java接口类来抽象出平台接口方法,所以每个工程的Android.mk是完全一致的,也就是说libgame.s ...