20170801_动态规划之爬楼梯有多少不同的方法
2017-08-01 14:47
190 查看
20170801_动态规划之爬楼梯有多少不同的方法
问题:爬楼梯的方法有多少种方法?
N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
输入描述:
输入包括一个整数N, (1<=N<90)。
输出描述:
直接输出方法数。
分析:
1、这是一个动态规划问题(DP问题)。需要找出状态和状态转移方程。
2、设计一个结果表 res
。
根据题目中的问题“问有多少种上楼方式?”,可以直接得出状态
res[i]。
res[i] 表示:当有 i 层楼梯时,共有 res[i] 种方法。那么 res[i] 等于什么呢?
可以这样想:第一部分的最后一步是从第 i-1 层楼梯爬上第 i 层楼梯,这和 res[i-1] 一样;
第二部分的最后一步是从第 i-2 层楼梯爬上第 i 层楼梯,这和 res[i-2] 一样。
所以状态转移方程:res[i] = res[i-1] + res[i-2]
3、有了状态和状态转移方程,就可以编码了。
//爬楼梯的方法有多少种
// N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
//输入描述:
//输入包括一个整数N,(1<=N<90)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
long long climbStairs(int n)
{
//这是一个动态规划问题,可是使用DP算法求解
//设计一个结果表,并进行初始化
//res(i)表示楼梯有i层时的爬楼梯方法,其中res(1)=1;res(2)=2;res(3)=3.
//那么状态方程是:res(i)=res(i-1)+res(i-2) 90>i>=3
if(n<1 || n>=90)
return 0;
else
{
vector<long long> res(n+1,0);
if(n==1)
res[1]=1;
else
{
res[1]=1;
res[2]=2;
}
for(int i=3; i<=n; ++i)
{
res[i]=res[i-1]+res[i-2];
}
return res
;
}
}
};
int main(void)
{
int n=0;
Solution object;
long lon
4000
g res=0;
while(cin>>n)
{
res=object.climbStairs(n);
cout<<res<<endl;
}
return 0;
}
问题:爬楼梯的方法有多少种方法?
N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
输入描述:
输入包括一个整数N, (1<=N<90)。
输出描述:
直接输出方法数。
分析:
1、这是一个动态规划问题(DP问题)。需要找出状态和状态转移方程。
2、设计一个结果表 res
。
根据题目中的问题“问有多少种上楼方式?”,可以直接得出状态
res[i]。
res[i] 表示:当有 i 层楼梯时,共有 res[i] 种方法。那么 res[i] 等于什么呢?
可以这样想:第一部分的最后一步是从第 i-1 层楼梯爬上第 i 层楼梯,这和 res[i-1] 一样;
第二部分的最后一步是从第 i-2 层楼梯爬上第 i 层楼梯,这和 res[i-2] 一样。
所以状态转移方程:res[i] = res[i-1] + res[i-2]
3、有了状态和状态转移方程,就可以编码了。
//爬楼梯的方法有多少种
// N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
//输入描述:
//输入包括一个整数N,(1<=N<90)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
long long climbStairs(int n)
{
//这是一个动态规划问题,可是使用DP算法求解
//设计一个结果表,并进行初始化
//res(i)表示楼梯有i层时的爬楼梯方法,其中res(1)=1;res(2)=2;res(3)=3.
//那么状态方程是:res(i)=res(i-1)+res(i-2) 90>i>=3
if(n<1 || n>=90)
return 0;
else
{
vector<long long> res(n+1,0);
if(n==1)
res[1]=1;
else
{
res[1]=1;
res[2]=2;
}
for(int i=3; i<=n; ++i)
{
res[i]=res[i-1]+res[i-2];
}
return res
;
}
}
};
int main(void)
{
int n=0;
Solution object;
long lon
4000
g res=0;
while(cin>>n)
{
res=object.climbStairs(n);
cout<<res<<endl;
}
return 0;
}
相关文章推荐
- 楼梯上有n阶台阶,上楼时可以一步上1阶,也可以一步上两阶,编写算法计算共有多少种不同的上楼梯的方法。
- 【杭电oj】- 2041-超级楼梯(上一级或两级,多少种方法)
- 填算式 ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法?
- 楼梯有n阶台阶,上楼可以一步上1阶,2阶,3阶,编程序计算共有多少种不同的走法?
- 换分币:用一元人民币兑换成1 分、2 分和5 分硬币,共有多少种不同的兑换方法
- java__假设你现在正在爬楼梯,楼梯有 nn 级。每次你只能爬 11 级或者 22 级,那么你有多少种方法爬到楼梯的顶部
- 爬楼梯问题,一共有n阶台阶,每次你可以走1或者2个台阶,到达顶端一共有多少种不同的走法?
- 动态规划之----我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- 看这个算式:☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。这个算式有多少种可能的正确填写方法?
- (动态规划)求有多少种不同的凑法
- swift方法实现查看1234能组成多少不同的三位数
- 问题五十七: 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编程序计算共有多少种不同的走法?
- 现有一个m * n的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子
- swift方法实现查看1234能组成多少不同的三位数
- 楼梯有n阶台阶,上楼可以一步上1阶,2阶,3阶,编程序计算共有多少种不同的走法?
- 如何寻找图层中某一字段中有多少个不同值(DISTINCT,pQueryFilter )的方法
- 一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?
- 115. Distinct Subsequences 字符串有多少种不同的删除方法能得到字符串t
- 可变参数:定义方法的时候不知道该定义多少个参数
- o3d中对人体模特的不同部分单独贴图的实现方法