爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶
这个题其实和斐波拉契数列相差无几,如果采用动态规划,找到状态变化方程,自底向上的计算,动态规划的模板
1:找到base case,如果dp[i]=i代表到第i阶台阶有i种方式,那么
base[1]=1
base[2]=2
2 dor循环套用模板,并且有if(i>=3) 有
dp[i] = dp[i-1]+dp[i-2]
因此可写出动态规划代码如下:
//有多少种方式问题
public static int goUpstairs(int n)
{
//例外情况
if(n<=0)
return -1;
//开辟数组记录前面的计算,以空间换时间
int []dp = new int[n+1];
for(int i=1;i<=n;i++)
{
//base case 为1 和 2
if(i==1)
dp[i] = 1;
if(i==2)
dp[i]=2;
//
if(i>=3)
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}