题⽬问的是到达顶端的⽅法数,我们采⽤序列类问题的通⽤分析⽅法,可以得到如下四要素:
1. State: f[i] 爬到第i级的⽅法数
2. Function: f[i]=f[i-1]+f[i-2]
3. Initialization: f[0]=1,f[1]=1
4. Answer: f[n]
尤其注意状态转移⽅程的写法,f[i]只可能由两个中间状态转化⽽来,⼀个是f[i-1],由f[i-1]到f[i]其⽅法
总数并未增加;另⼀个是f[i-2],由f[i-2]到f[i]隔了两个台阶,因此有1+1和2两个⽅法,因此容易写成
f[i]=f[i-1]+f[i-2]+1,但仔细分析后能发现,由f[i-2]到f[i]的中间状态f[i-1]已经被利⽤过⼀次,故f[i]=f[i-
1]+f[i-2]. 使⽤动规思想解题时需要分清『重叠⼦状态』, 如果有重复的需要去重。
int climbStairs(int n) {
if(n < 0)
return 0;
vector<int> res(n+1, 1);
for(int i = 2; i < n+1; ++i)
res[i] = res[i-1] + res[i-2];
return res[n];
}
或者可以用3个变量来代替上面的数组
int climbStairs(int n) {
if(n < 1)
return 0;
int ret0 = 1, ret1 = 1, ret2 = 1;
for(int i = 2; i < n+1; ++i){
ret0 = ret1 + ret2;
ret2 = ret1;
ret1 = ret0;
}
return ret0;
}