There is a street of length n and as we know it has two sides. Therefore a total of 2 * n spots are available. In each of these spots either a house or an office can be built with following 2 restrictions:
1. No two offices on the same side of the street can be adjacent.
2. No two offices on different sides of the street can be exactly opposite to each other i.e. they can’t overlook each other.
There are no restrictions on building houses and each spot must either have a house or office.
Given length of the street n, find total number of ways to build the street.
Examples:
Input : 2
Output : 7
Please see below diagram for explanation.
Input : 3
Output : 17
Following image depicts the 7 possible ways for building the street with N = 2

Ways for building street with length 1
with 2 houses: (H H) = {1}
with 1 office and 1 house: (O H) (H O) = {2}
(O O) is not allowed according to the problem statement.
Total = 1 + 2 = 3
For length = 2,
with 2 houses: (H H) can be added to all
the cases of length 1:
(H H) (H H) (H H)
(H H) (O H) (H O) = {3}
with 1 office and 1 house:
(O H) and (H O) can both be added to all
the cases of length 1 with last row (H H)
(O H) (H O)
(H H) (H H) = {2}
when last row of a case of length 1
contains 1 office, it can only be
extended in one way to build an office
in row 2.
(H O) (O H)
(O H) (H O) = {2}
(O H) (H O) (O O)
(O H) (H O) (O H) etc are not allowed.
Total = 3 + 2 + 2 = 7
Since the problem can be solved by finding solution for smaller subproblems and then extending the same logic, it can be solved using dynamic programming. We move in steps of one unit length. For each row we have two options:
Build houses in both the spots
Build one house and one office
The first one can be done without any constraints. There is one way of building houses in both the spots at length i. So total ways using this choice = total ways for length i – 1.
For the second choice, if row (i-1) had houses in both spots we have two ways of building a office i.e. (H O) and (O H)
if row(i-1) had an office in one of its two spots we only have one way to build an office in row i.If prev row had (O H) curr row would have (H O) and similarly for prev row = (H O) curr row = (O H).
From the above logic, total ways with this choice = 2 * (choice1(i-1)) + choice2(i-1)
We will build a 2D dp for this.
dp[0][i] indicates choice1 and dp[1][i] indicates choice2 for row i.
Below is the implementation of above idea :
C++
#include <bits/stdc++.h>
using namespace std;
long countWays( int n)
{
long dp[2][n + 1];
dp[0][1] = 1;
dp[1][1] = 2;
for ( int i = 2; i <= n; i++) {
dp[0][i] = dp[0][i - 1] + dp[1][i - 1];
dp[1][i] = dp[0][i - 1] * 2 + dp[1][i - 1];
}
return dp[0][n] + dp[1][n];
}
int main()
{
int n = 5;
cout << "Total no of ways with n = " << n
<< " are: " << countWays(n) << endl;
}
|
Java
public class GFG {
static long countWays( int n) {
long dp[][] = new long [ 2 ][n + 1 ];
dp[ 0 ][ 1 ] = 1 ;
dp[ 1 ][ 1 ] = 2 ;
for ( int i = 2 ; i <= n; i++) {
dp[ 0 ][i] = dp[ 0 ][i - 1 ] + dp[ 1 ][i - 1 ];
dp[ 1 ][i] = dp[ 0 ][i - 1 ] * 2 + dp[ 1 ][i - 1 ];
}
return dp[ 0 ][n] + dp[ 1 ][n];
}
public static void main(String[] args) {
int n = 5 ;
System.out.print( "Total no of ways with n = " + n
+ " are: " + countWays(n));
}
}
|
Python3
def countWays(n) :
dp = [[ 0 ] * (n + 1 ) for i in range ( 2 )]
dp[ 0 ][ 1 ] = 1
dp[ 1 ][ 1 ] = 2
for i in range ( 2 , n + 1 ) :
dp[ 0 ][i] = dp[ 0 ][i - 1 ] + dp[ 1 ][i - 1 ]
dp[ 1 ][i] = (dp[ 0 ][i - 1 ] * 2 +
dp[ 1 ][i - 1 ])
return dp[ 0 ][n] + dp[ 1 ][n]
if __name__ = = "__main__" :
n = 5
print ( "Total no of ways with n =" ,
n, "are:" , countWays(n))
|
C#
using System;
public class GFG{
static long countWays( int n) {
long [,]dp = new long [2 , n + 1];
dp[0,1] = 1;
dp[1,1] = 2;
for ( int i = 2; i <= n; i++) {
dp[0 , i] = dp[0 , i - 1] + dp[1 , i - 1];
dp[1 , i] = dp[0 , i - 1] * 2 + dp[1 , i - 1];
}
return dp[0 , n] + dp[1 , n];
}
public static void Main() {
int n = 5;
Console.Write( "Total no of ways with n = " + n
+ " are: " + countWays(n));
}
}
|
PHP
<?php
function countWays( $n )
{
$dp [0][1] = 1;
$dp [1][1] = 2;
for ( $i = 2; $i <= $n ; $i ++) {
$dp [0][ $i ] = $dp [0][ $i - 1] +
$dp [1][ $i - 1];
$dp [1][ $i ] = $dp [0][ $i - 1] *
2 + $dp [1][ $i - 1];
}
return $dp [0][ $n ] + $dp [1][ $n ];
}
$n = 5;
echo "Total no of ways with n = " , $n ,
" are: " ,countWays( $n ), "\n" ;
?>
|
Javascript
<script>
function countWays(n)
{
let dp = new Array(2);
for (let i = 0; i < 2; i++)
{
dp[i] = new Array(n + 1);
}
dp[0][1] = 1;
dp[1][1] = 2;
for (let i = 2; i <= n; i++)
{
dp[0][i] = dp[0][i - 1] + dp[1][i - 1];
dp[1][i] = dp[0][i - 1] * 2 + dp[1][i - 1];
}
return dp[0][n] + dp[1][n];
}
let n = 5;
document.write( "Total no of ways with n = " +
n + " are: " + countWays(n));
</script>
|
Output
Total no of ways with n = 5 are: 99
Time Complexity: O(N)
Auxiliary Space: O(N)
Another Method
Suppose you have A(n-1) and A(n-2) ,where A(i) depicts ways for 2*i buildings, then :
A(n) = (Number of ways you have (H H) in A(n-1) )*3 + (Number of ways you have (O H) in A(n-1))*2
How these cases arise ? Simply you can think of making 2 states as examined in above explanation.
Number of ways you have (H H) in A(n-1) = Fix H H in (n-1)th position, this is equal to number of ways of n-2 position (fixing n-1 to H H).
Number of ways you have (O H) in A(n-1) = (Number of ways in n-1 ) – (Number of ways of H H in A(n-1) position).
So A(n) = 3*A(n-2) + 2*(A(n-1)-A(n-2)) = 2*A(n-1)+A(n-2)
C++
#include <iostream>
using namespace std;
int countways( long long n)
{
long long A[n+1];
A[0] = 1;
A[1] = 3;
A[2] = 7;
for ( int i=2;i<=n;i++)
{
A[i] = 2*A[i-1]+A[i-2];
}
return A[n];
}
int main() {
int n = 5;
cout << countways(5) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG{
static int countways( int n)
{
int [] A = new int [n+ 1 ];
A[ 0 ] = 1 ;
A[ 1 ] = 3 ;
A[ 2 ] = 7 ;
for ( int i = 2 ; i <= n; i++)
{
A[i] = 2 * A[i - 1 ] + A[i - 2 ];
}
return A[n];
}
public static void main(String[] args)
{
int n = 5 ;
System.out.println(countways( 5 ));
}
}
|
Python3
def countways(n):
A = [ 0 for i in range (n + 2 )]
A[ 0 ] = 1
A[ 1 ] = 3
A[ 2 ] = 7
for i in range ( 2 , n + 1 ):
A[i] = 2 * A[i - 1 ] + A[i - 2 ]
return A[n]
n = 5
print (countways( 5 ))
|
C#
using System;
class GFG{
static int countways( int n)
{
int [] A = new int [n+1];
A[0] = 1;
A[1] = 3;
A[2] = 7;
for ( int i = 2; i <= n; i++)
{
A[i] = 2 * A[i - 1] + A[i - 2];
}
return A[n];
}
public static void Main()
{
int n = 5;
Console.Write(countways(n));
}
}
|
Javascript
<script>
function countways(n)
{
let A = new Array(n+1).fill(0);
A[0] = 1;
A[1] = 3;
A[2] = 7;
for (let i=2;i<=n;i++)
{
A[i] = 2*A[i-1]+A[i-2];
}
return A[n];
}
let n = 5;
document.write(countways(5))
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
This article is contributed by Aditi Sharma. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.