题目链接:点击查看
题目描述:
给定
n
节台阶,每次可以走一步或走两步,求一共有多少种方式可以走完这些台阶。
输入输出:
输入: 2 输出: 2
输入: 3 输出: 3
题目分析:
这是十分经典的斐波那契数列题。定义一个数组
dp
,
dp[i]
表示走到第
i
阶的方法数。因为我们每次可以走一步或者两步,所以第 i
阶可以从第
i-1
或
i-2
阶到达。换句话说,走到第
i
阶的方法数即为走到第 i-1
阶的方法数加上走到第
i-2
阶的方法
数。这样我们就得到了状态转移方程dp[i] = dp[i-1] + dp[i-2]。注意边界条件的处理。
代码:
int climbStairs(int n)
{
if(n<=2)
return n;
vector<int>dp(n+1,1);//这里主要目的是把前两个数初始化为1
for(int i=2;i<=n;++i)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
优化:
进一步的,我们可以对动态规划进行空间压缩。因为 dp[i] 只与 dp[i-1] 和 dp[i-2] 有关,因此可以只用两个变量来存储 dp[i-1] 和 dp[i-2],使得原来的 O(n) 空间复杂度优化为 O(1) 复杂度。
代码:
int climbStairs(int n)
{
if(n<=2)
return n;
int pre2=1,pre1=2,cur;
for(int i=2;i<n;++i)
{
cur=pre1+pre2;
pre2=pre1;
pre1=cur;
}
return cur;
}