Functional Programming
  • Preface
  • Getting Started
  • Sorting
    • Bubble Sort
    • Merge Sort
    • Insertion Sort
  • Stacks
    • Stack
  • Queues
    • Queue
    • Binary Heap (Priority Queue)
  • Trees
    • Binary Tree (Unbalanced)
    • Prefix Trie
  • Graphs
    • Undirected
    • Directed
    • Edge Weighted
  • Dynamic Programming
    • Knapsack
    • Longest Common Substring
    • Staircase
  • Leetcode/InterviewBit
    • 2 Sum [Easy]
    • Longest Valid Parentheses [Medium-Hard]
    • Kth Smallest Element [Medium]
    • Max Profit [2 variations: 1st Easy 2nd Hard]
    • Pretty Print 2D Matrix [Easy]
    • Max Contiguous Subarray (Kadane's) [Medium (just cause its tricky)]
    • Permutations [Medium]
    • Next Permutation [Medium]
Powered by GitBook
On this page
  • Algorithm
  • Implementation

Was this helpful?

  1. Dynamic Programming

Staircase

This one is a classic: Given a staircase with n steps and a list of possible hops, find the number of ways you can get to the top

Algorithm

      _ 
    _|
  _|
_|

If our hops are [1, 2] then for the 3 step staircase above we can
reach the top via [1, 1, 1], [1, 2], [2, 1] so 3 ways. If there was
a 4th step we can do [1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]
i.e. 5 ways. Noticing a pattern?:

1 step

2 steps

3 steps

4 steps

5 steps

6 steps

1

1 way for 1 step + 1 way via [2]= 2

2 ways for 2 step + 1 way for 1 ways for 1 step = 3

3 ways for 3 step + 2 ways for 2 step = 5

8

13

Since we have 2 hops: [1, 2], we get the fibonacci sequence. If we added a 3 to our possible hops: [1, 2, 3] we'd add the # of ways from the current step - 1, current step - 2, and current step - 3, so we'd have:

1 step

2 steps

3 steps

4 steps

5 steps

1

1 way for 1 step + 1 way via [2] = 2

1 way for 1 step + 2 ways for 2 step + 1 way via [3]= 4

1 way for 1 step + 2 ways for 2 step + 4 ways for 3 steps: = 7

13

Implementation

def numWaysUpStairs(n: Int, hops: List[Int]): Int =
  1.until(n + 1)
    .foldLeft(Vector.fill(n + 1)(0).updated(0, 1)) { (out, i) =>
      hops.foldLeft(out) { (out, incr) =>
        if (incr <= i)
          out.updated(i, out(i) + out(i - incr))
        else out
      }
    }(n)
PreviousLongest Common SubstringNextLeetcode/InterviewBit

Last updated 6 years ago

Was this helpful?