动态规划应用之爬楼梯

问题描述:

假设你正在爬楼梯。需要 n 步你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 步 + 1 步
2.  2 步

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 步 + 1 步 + 1 步
2.  1 步 + 2 步
3.  2 步 + 1 步

思路:如果要爬到第i层台阶,因为每次只能爬1层台阶或者2层台阶,所以说只能是从第i-1层台阶或者第i-2层台阶到达第i层,所以到达第i层台阶的方法总数就是到达第i-1层的方法总数加上到达第i-2层的方法总数。这就是为什么爬楼梯问题也是属于动态规划算法的原因,爬第i层楼梯的方法数只计算一次,然后进行保存,以备直接利用进行计算。

int climbStairs(int n) {
	int a[1000] = { 0 };
    a[0] = 0;//
	a[1] = 1;//爬一层台阶共有1种方法
	a[2] = 2;//爬二层台阶共有2种方法,1+1或者直接2
	if (n > 1000)
		return 0;
	//因为每次只能是1步或者2步,所以怕第i层台阶的方法总数
	//就是爬第i-1层台阶的方法数加上爬第i-2层台阶的方法数
	for (int i = 3; i <= n; ++i) {
		a[i] = a[i - 1] + a[i - 2];
	}
	return a[n];
}
int main()
{
	int max;
	max = climbStairs(10);
	cout << max << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/80017633