package main

import "fmt"

func main() {

	fmt.Println(climbStairs(4))
}
/**
斐波那契数列 前一个数等于前两个数之和
可以想,走到第i级台阶有几种方法呢,2种。
1. 从i - 1级走一步到n级
2. 从i - 2级走两步到n级
那也就是说,走到第i级台阶的走法有f[i] = f[i - 1] + f[i - 2],也就是用第i - 1级台阶的走法加上第i - 2级台阶的走法。
于是,可以这样设计:
用一个数组,record,record[i]保存有i级台阶时有多少走法,类似与递归,数组每一项的的结果由前两项加和得到,触底的条件是i = 0, i = 1时,结果都是1.
 */
func climbStairs(n int) int {

	// 前两个已经,直接返回
	if n <= 2 {
		return n
	}

	// 声明切片
	dp := make([]int, n)
	dp[0] = 1
	dp[1] = 2
	for i := 2; i < n; i++ {
		dp[i] = dp[i-1] + dp[i-2]
	}
	return dp[n-1]
}