假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
解法
一、回(暴)溯(力)法
通过穷举所有的可能,来确定答案。显然,这样做会超出时间限制。
public int ClimbStairs(int n)
{
List<int> count = new List<int>();
BackTrack(n, count);
return count.Count;
}
public void BackTrack(int n, List<int> count)
{
if (n == 0) count.Add(1);//计数
else
{
for (int i = 1; i <= 2; i++)
{
if (n - i >= 0)
{
n -= i;
BackTrack(n, count);
n += i;
}
}
}
}
二、动态规划
根据题意,每次可以爬 1 或 2 个台阶,所以第 i 阶可以由第 i-1 阶和第 i-2 阶到达。
所以到达第 i 阶的方法数等于第 i-1 阶和第 i-2 阶方法数之和。
动态方程:step[i] = step[i - 1] + step[i - 2]
public int ClimbStairs(int n)
{
if (n == 1) return 1;
int[] step = new int[n + 1];
step[1] = 1;
step[2] = 2;
for (int i = 3; i <= n; i++)
{
step[i] = step[i - 1] + step[i - 2];
}
return step[n];
}