Open In App

Count ways to build street under given constraints

Improve
Improve
Like Article
Like
Save
Share
Report

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++




// C++ program to count ways to build street
// under given constraints
#include <bits/stdc++.h>
using namespace std;
 
// function to count ways of building
// a street of n rows
long countWays(int n)
{
    long dp[2][n + 1];
 
    // base case
    dp[0][1] = 1;
    dp[1][1] = 2;
 
    for (int i = 2; i <= n; i++) {
 
        // ways of building houses in both
        // the spots of ith row
        dp[0][i] = dp[0][i - 1] + dp[1][i - 1];
 
        // ways of building an office in one of
        // the two spots of ith row
        dp[1][i] = dp[0][i - 1] * 2 + dp[1][i - 1];
    }
 
    // total ways for n rows
    return dp[0][n] + dp[1][n];
}
 
// driver program for checking above function
int main()
{
 
    int n = 5;
    cout << "Total no of ways with n = " << n
         << " are: " << countWays(n) << endl;
}


Java




// Java program to count ways to build street
// under given constraints
public class GFG {
 
// function to count ways of building
// a street of n rows
    static long countWays(int n) {
        long dp[][] = new long[2][n + 1];
 
        // base case
        dp[0][1] = 1;
        dp[1][1] = 2;
 
        for (int i = 2; i <= n; i++) {
 
            // ways of building houses in both
            // the spots of ith row
            dp[0][i] = dp[0][i - 1] + dp[1][i - 1];
 
            // ways of building an office in one of
            // the two spots of ith row
            dp[1][i] = dp[0][i - 1] * 2 + dp[1][i - 1];
        }
 
        // total ways for n rows
        return dp[0][n] + dp[1][n];
    }
 
// driver program for checking above function
    public static void main(String[] args) {
 
        int n = 5;
        System.out.print("Total no of ways with n = " + n
                + " are: " + countWays(n));
    }
 
}
 
/*This code is contributed by PrinciRaj1992*/


Python3




# Python3 program to count ways to build
# street under given constraints
 
# function to count ways of building
# a street of n rows
def countWays(n) :
     
 
    dp = [[0] * (n + 1) for i in range(2)]
     
    # base case
    dp[0][1] = 1
    dp[1][1] = 2
     
    for i in range(2, n + 1) :
         
        # ways of building houses in both
        # the spots of ith row
        dp[0][i] = dp[0][i - 1] + dp[1][i - 1]
         
        # ways of building an office in one of
        # the two spots of ith row
        dp[1][i] = (dp[0][i - 1] * 2 +
                    dp[1][i - 1])
     
    # total ways for n rows
    return dp[0][n] + dp[1][n]
 
# Driver Code
if __name__ == "__main__" :
     
    n = 5
    print("Total no of ways with n =",
              n, "are:", countWays(n))
 
# This code is contributed by Ryuga


C#




// C# program to count ways to build street
// under given constraints
 
using System;
public class GFG{
 
 
// function to count ways of building
// a street of n rows
    static long countWays(int n) {
        long [,]dp = new long[2 , n + 1];
 
        // base case
        dp[0,1] = 1;
        dp[1,1] = 2;
 
        for (int i = 2; i <= n; i++) {
 
            // ways of building houses in both
            // the spots of ith row
            dp[0 , i] = dp[0 , i - 1] + dp[1 , i - 1];
 
            // ways of building an office in one of
            // the two spots of ith row
            dp[1 , i] = dp[0 , i - 1] * 2 + dp[1 , i - 1];
        }
 
        // total ways for n rows
        return dp[0 , n] + dp[1 , n];
    }
 
// driver program for checking above function
    public static void Main() {
 
        int n = 5;
        Console.Write("Total no of ways with n = " + n
                + " are: " + countWays(n));
    }
 
}
 
/*This code is contributed by PrinciRaj1992*/


PHP




<?php
// PHP program to count ways to build street
// under given constraints
 
// function to count ways of building
// a street of n rows
function countWays($n)
{
 
    // base case
    $dp[0][1] = 1;
    $dp[1][1] = 2;
 
    for ($i = 2; $i <= $n; $i++) {
 
        // ways of building houses in both
        // the spots of ith row
        $dp[0][$i] = $dp[0][$i - 1] +
                     $dp[1][$i - 1];
 
        // ways of building an office in one of
        // the two spots of ith row
        $dp[1][$i] = $dp[0][$i - 1] *
                     2 + $dp[1][$i - 1];
    }
 
    // total ways for n rows
    return $dp[0][$n] + $dp[1][$n];
}
 
    // Driver Code
    $n = 5;
    echo "Total no of ways with n = ",$n,
         " are: " ,countWays($n),"\n";
 
// This code is contributed by jit_t
?>


Javascript




<script>
 
// Javascript program to count ways to
// build street under given constraints
   
// Function to count ways of building
// a street of n rows
function countWays(n)
{
    let dp = new Array(2);
  
    for(let i = 0; i < 2; i++)
    {
        dp[i] = new Array(n + 1);
    }
     
    // Base case
    dp[0][1] = 1;
    dp[1][1] = 2;
 
    for(let i = 2; i <= n; i++)
    {
         
        // Ways of building houses in both
        // the spots of ith row
        dp[0][i] = dp[0][i - 1] + dp[1][i - 1];
 
        // Ways of building an office in one of
        // the two spots of ith row
        dp[1][i] = dp[0][i - 1] * 2 + dp[1][i - 1];
    }
 
    // Total ways for n rows
    return dp[0][n] + dp[1][n];
}
 
// Driver code
let n = 5;
document.write("Total no of ways with n = " +
               n + " are: " + countWays(n));
                
// This code is contributed by suresh07
 
</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++




// C++ program of above approach
#include <iostream>
using namespace std;
 
// Program to count ways
int countways(long long n)
{
    long long A[n+1];
    A[0] = 1;
    A[1] = 3;
    A[2] = 7;
   
    // Iterate from 2 to n
    for(int i=2;i<=n;i++)
    {
        A[i] = 2*A[i-1]+A[i-2];
    }
    return A[n];
}
 
// Driver code
int main() {
    int n = 5;
   
    // Count Ways 
    cout << countways(5) << endl;
    return 0;
}


Java




// Java program of above approach
import java.io.*;
 
class GFG{
     
// Program to count ways
static int countways(int n)
{
    int [] A = new int[n+1];
    A[0] = 1;
    A[1] = 3;
    A[2] = 7;
   
    // Iterate from 2 to n
    for(int i = 2; i <= n; i++)
    {
        A[i] = 2 * A[i - 1] + A[i - 2];
    }
    return A[n];
}
 
// Driver code
public static void main(String[] args)
{
    int n = 5;
     
    // Count Ways 
    System.out.println(countways(5));
}
}
 
// This code is contributed by Ankita saini


Python3




# Python3 program of above approach
 
# Program to count ways
def countways(n):
     
    A = [0 for i in range(n + 2)]
    A[0] = 1
    A[1] = 3
    A[2] = 7
 
    # Iterate from 2 to n
    for i in range(2, n + 1):
        A[i] = 2 * A[i - 1] + A[i - 2]
         
    return A[n]
 
# Driver code
n = 5
 
# Count Ways
print(countways(5))
 
# This code is contributed by Sanjit_Prasad


C#




// C# program of above approach
using System;
 
class GFG{
     
// Program to count ways
static int countways(int n)
{
    int [] A = new int[n+1];
    A[0] = 1;
    A[1] = 3;
    A[2] = 7;
   
    // Iterate from 2 to n
    for(int i = 2; i <= n; i++)
    {
        A[i] = 2 * A[i - 1] + A[i - 2];
    }
    return A[n];
}
 
// Driver code
public static void Main()
{
    int n = 5;
     
    // Count Ways 
    Console.Write(countways(n));
}
}
 
// This code is contributed by bunnyram19.


Javascript




<script>
 
// Javascript program of above approach
 
// Program to count ways
function countways(n)
{
    let A = new Array(n+1).fill(0);
    A[0] = 1;
    A[1] = 3;
    A[2] = 7;
   
    // Iterate from 2 to n
    for(let i=2;i<=n;i++)
    {
        A[i] = 2*A[i-1]+A[i-2];
    }
    return A[n];
}
 
// driver program
 
        let n = 5;
   
    // Count Ways 
    document.write(countways(5))
         
</script>


Output

99

Time Complexity: O(N) 
Auxiliary Space: O(N)

 



Last Updated : 20 Sep, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads