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个盒子按照 ...
随机推荐
- 驱动开发 - WDK 调试及 SVN 环境搭建
由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...
- Android 国际化字符串资源,各语言目录表及从字符串资源文件读字符方法
字符串国际化 只要在 res 目录下 建对应语言的 values 目录即可. res下values是所有资源(包括字符串资源)的默认目录,如果没有特指资源目录或找不到某资源时,就用它. 如values ...
- ERP 及相关名词的含义
英文缩写 英文名称 中文含义 MRP Material requirements planning 物料需求计划 MRP II Manufacturing resource planning 制造 ...
- bzoj2298
不难发现必然是两个人之间话产生矛盾或自身话有问题很显然,当ai>aj时,若ai<n-bj时i,j两人话矛盾ai<ai<n-bj,这东西有没有数轴上的线段的既视感?我们只要求出做 ...
- mat之一--eclipse安装Memory Analyzer
工欲善其事必先利其器,先开始更新下eclipse,顺便装下工具软件.那么简要的写写怎么从头安装Memory Analyzer Memory Analyzer (Eclipse MAT)是一个跨平台的开 ...
- 【转】Installing OpenCV on Debian Linux
In this post I will describe the process of installing OpenCV(both versions 2.4.2 and 2.4.3) on Debi ...
- c++/c字符串操作汇集
1. 字符串替换 void string_replace(std::string &strBig, const std::string &strsrc, const std::stri ...
- [codevs3296]有序数组合并
题目描述 Description 合并两个有序数组A和B,使得结果依然有序. 进阶:合并两个有序数组A和B,假设A有n个数,B有m个数,A数组后面还有m个空余空间,需要将结果保存在A中. 请使用O(n ...
- bzoj2946 [Poi2000]公共串(SA,SAM)
[题意] 多串求LCS. [思路] 主要是想找一下SAM的优越感 :) velui good 后缀数组划分height需要注意不少细节 <_<,然后不停debug [代码] ...
- HDU 2509
与HDU 1907一样... #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...