diff --git a/dynamic_programming/climbing-stairs.rb b/dynamic_programming/climbing-stairs.rb new file mode 100644 index 0000000..8b510fe --- /dev/null +++ b/dynamic_programming/climbing-stairs.rb @@ -0,0 +1,58 @@ +#You are climbing a staircase. It takes n steps to reach the top. +#Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? + +#Example 1: +#Input: n = 2 +#Output: 2 +#Explanation: There are two ways to climb to the top. +#1. 1 step + 1 step +#2. 2 steps + +#Example 2: +#Input: n = 3 +#Output: 3 +#Explanation: There are three ways to climb to the top. +#1. 1 step + 1 step + 1 step +#2. 1 step + 2 steps +#3. 2 steps + 1 step + +#Constraints: +#1 <= n <= 45 + + + + +#Dynamic Programming, Recursive Bottom Up Approach - O(n) Time / O(n) Space +#Init memoization hash (only 1 parameter) +#Set base cases which are memo[0] = 1 and memo[1] = 1, since there are only 1 way to get to each stair +#Iterate from 2..n and call recurse(n, memo) for each value n. +#Return memo[n]. + +#recurse(n, memo) - Recurrence Relation is n = (n - 1) + (n - 2) +#return memo[n] if memo[n] exists. +#otherwise, memo[n] = recurse(n - 1, memo) + recurse(n - 2, memo) + + +# @param {Integer} n +# @return {Integer} +def climb_stairs(n) + memo = Hash.new + + memo[0] = 1 + memo[1] = 1 + + return memo[n] if n <= 1 && n >= 0 + + (2..n).each do |n| + recurse(n, memo) + end + + memo[n] +end + + +def recurse(n, memo) + return memo[n] if memo[n] + + memo[n] = recurse(n - 1, memo) + recurse(n - 2, memo) +end \ No newline at end of file