Given an input number of sections and each section has 2 plots on either sides of the road. Find all possible ways to construct buildings in the plots such that there is a space between any 2 buildings.
N = 1 Output = 4 Place a building on one side. Place a building on other side Do not place any building. Place a building on both sides. N = 3 Output = 25 3 sections, which means possible ways for one side are BSS, BSB, SSS, SBS, SSB where B represents a building and S represents an empty space Total possible ways are 25, because a way to place on one side can correspond to any of 5 ways on other side. N = 4 Output = 64
We strongly recommend to minimize your browser and try this yourself first
We can simplify the problem to first calculate for one side only. If we know the result for one side, we can always do square of the result and get result for two sides.
A new building can be placed on a section if section just before it has space. A space can be placed anywhere (it doesn’t matter whether the previous section has a building or not).
Let countB(i) be count of possible ways with i sections ending with a building. countS(i) be count of possible ways with i sections ending with a space. // A space can be added after a building or after a space. countS(N) = countB(N-1) + countS(N-1) // A building can only be added after a space. countB[N] = countS(N-1) // Result for one side is sum of the above two counts. result1(N) = countS(N) + countB(N) // Result for two sides is square of result1(N) result2(N) = result1(N) * result1(N)
Below is the implementation of above idea.
Count of ways for 3 sections is 25
Time complexity: O(N)
Auxiliary Space: O(1)
Algorithmic Paradigm: Dynamic Programming
Note that the above solution can be further optimized. If we take closer look at the results, for different values, we can notice that the results for two sides are squares of Fibonacci Numbers.
N = 1, result = 4 [result for one side = 2]
N = 2, result = 9 [result for one side = 3]
N = 3, result = 25 [result for one side = 5]
N = 4, result = 64 [result for one side = 8]
N = 5, result = 169 [result for one side = 13]
In general, we can say
result(N) = fib(N+2)2 fib(N) is a function that returns N'th Fibonacci Number.
Therefore, we can use O(LogN) implementation of Fibonacci Numbers to find number of ways in O(logN) time.
This article is contributed by GOPINATH. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Count the number of ways to construct the target string
- Count the number of ways to give ranks for N students such that same ranks are possible
- Print all possible ways to convert one string into another string | Edit-Distance
- Find all possible ways to Split the given string into Primes
- Count of binary strings of length N having equal count of 0's and 1's and count of 1's ≥ count of 0's in each prefix substring
- Count the number of ways to tile the floor of size n x m using 1 x m size tiles
- Count ways to reach the n'th stair
- Count number of ways to reach a given score in a game
- Bitmasking and Dynamic Programming | Set 1 (Count ways to assign unique cap to every person)
- Count number of ways to cover a distance
- Count number of ways to partition a set into k subsets
- Count number of ways to fill a "n x 4" grid using "1 x 4" tiles
- Count number of ways to reach destination in a Maze
- Count number of ways to jump to reach end
- Count ways to build street under given constraints
- Count ways to express 'n' as sum of odd integers
- Count ways to divide circle using N non-intersecting chords
- Count of different ways to express N as the sum of 1, 3 and 4
- Count ways to reach a score using 1 and 2 with no consecutive 2s
- Count number of ways to reach a given score in a Matrix