Count ways to reach Nth Stairs by taking 1 and 2 steps with exactly one 3 step - GeeksforGeeks

05 Jul, 2021
Given a number N which denotes the number of stairs, the task is to reach the Nth stair by taking 1, 2 steps any number of times and taking a step of 3 exactly once. Examples:  
Input: N = 4 Output: 2 Explanation: Since a step of 3 has to be taken compulsorily and only once, There are only two possible ways: (1, 3) or (3, 1)Input: N = 5 Output: 5 Explanation: Since a step of 3 has to be taken compulsorily and only once, There are only 5 possible ways: (1, 1, 3), (1, 3, 1), (3, 1, 1), (2, 3), (3, 2)  
 
Approach: This problem can be solved using Dynamic Programming. To Reach Nth stair the person should be on (N – 1)th, (N – 2)th or (N – 3)th. So, To reach Nth stair from the base Reach (N – 1)th stair which includes exact only one step of 3, Reach (N – 2)th step with the steps which includes exactly one step of 3 and Reach the (N – 3)th step without taking any step of 3. So, The Recurrence Relation for this problem will be –  
includes_3[i] = includes_3[i-1] + includes_3[i-2] + not_includes[i-3]  
whereas, the Recurrence relation when the 3 number of steps at a time is not allowed is  
not_includes[i] = not_includes[i – 1] + not_includes[i – 2]  
Below is the implementation of the above approach. 
C++
Java
Python3
C#
Javascript
// C++ implementation to find the number// the number of ways to reach Nth stair// by taking 1, 2 step at a time and// 3 Steps at a time exactly once. #include <iostream>using namespace std; // Function to find the number// the number of ways to reach Nth stairint number_of_ways(int n){    // Array including number    // of ways that includes 3    int includes_3[n + 1] = {};     // Array including number of    // ways that doesn't includes 3    int not_includes_3[n + 1] = {};     // Initially to reach 3 stairs by    // taking 3 steps can be    // reached by 1 way    includes_3[3] = 1;     not_includes_3[1] = 1;    not_includes_3[2] = 2;    not_includes_3[3] = 3;     // Loop to find the number    // the number of ways to reach Nth stair    for (int i = 4; i <= n; i++) {        includes_3[i]            = includes_3[i - 1] + includes_3[i - 2] + not_includes_3[i - 3];        not_includes_3[i]            = not_includes_3[i - 1] + not_includes_3[i - 2];    }    return includes_3[n];} // Driver Codeint main(){    int n = 7;     cout << number_of_ways(n);     return 0;}
// Java implementation to find the number// the number of ways to reach Nth stair// by taking 1, 2 step at a time and// 3 Steps at a time exactly once.class GFG{ // Function to find the number// the number of ways to reach Nth stairstatic int number_of_ways(int n){    // Array including number    // of ways that includes 3    int []includes_3 = new int[n + 1];         // Array including number of    // ways that doesn't includes 3    int []not_includes_3 = new int[n + 1];     // Initially to reach 3 stairs by    // taking 3 steps can be    // reached by 1 way    includes_3[3] = 1;     not_includes_3[1] = 1;    not_includes_3[2] = 2;    not_includes_3[3] = 3;     // Loop to find the number    // the number of ways to reach Nth stair    for (int i = 4; i <= n; i++)    {        includes_3[i]            = includes_3[i - 1] + includes_3[i - 2] +               not_includes_3[i - 3];        not_includes_3[i]            = not_includes_3[i - 1] + not_includes_3[i - 2];    }    return includes_3[n];} // Driver Codepublic static void main(String[] args){    int n = 7;     System.out.print(number_of_ways(n));}} // This code is contributed by Rajput-Ji
# Python3 implementation to find the number# the number of ways to reach Nth stair# by taking 1, 2 step at a time and# 3 Steps at a time exactly once. # Function to find the number# the number of ways to reach Nth stairdef number_of_ways(n):         # Array including number    # of ways that includes 3    includes_3 = [0]*(n + 1)     # Array including number of    # ways that doesn't includes 3    not_includes_3 = [0] * (n + 1)     # Initially to reach 3 stairs by    # taking 3 steps can be    # reached by 1 way    includes_3[3] = 1     not_includes_3[1] = 1    not_includes_3[2] = 2    not_includes_3[3] = 3     # Loop to find the number    # the number of ways to reach Nth stair    for i in range(4, n + 1):        includes_3[i] = includes_3[i - 1] + \                        includes_3[i - 2] + \                        not_includes_3[i - 3]        not_includes_3[i] = not_includes_3[i - 1] + \                           not_includes_3[i - 2]    return includes_3[n] # Driver Coden = 7 print(number_of_ways(n)) # This code is contributed by mohit kumar 29
// C# implementation to find the number// the number of ways to reach Nth stair// by taking 1, 2 step at a time and// 3 Steps at a time exactly once.using System; class GFG{ // Function to find the number// the number of ways to reach Nth stairstatic int number_of_ways(int n){    // Array including number    // of ways that includes 3    int []includes_3 = new int[n + 1];         // Array including number of    // ways that doesn't includes 3    int []not_includes_3 = new int[n + 1];     // Initially to reach 3 stairs by    // taking 3 steps can be    // reached by 1 way    includes_3[3] = 1;     not_includes_3[1] = 1;    not_includes_3[2] = 2;    not_includes_3[3] = 3;     // Loop to find the number    // the number of ways to reach Nth stair    for (int i = 4; i <= n; i++)    {        includes_3[i]            = includes_3[i - 1] + includes_3[i - 2] +            not_includes_3[i - 3];        not_includes_3[i]            = not_includes_3[i - 1] + not_includes_3[i - 2];    }    return includes_3[n];} // Driver Codepublic static void Main(String[] args){    int n = 7;     Console.Write(number_of_ways(n));}} // This code is contributed by PrinciRaj1992
<script> // JavaScript implementation to find the number// the number of ways to reach Nth stair// by taking 1, 2 step at a time and// 3 Steps at a time exactly once. // Function to find the number// the number of ways to reach Nth stairfunction number_of_ways(n){    // Array including number    // of ways that includes 3    let includes_3 = new Uint8Array(n + 1);     // Array including number of    // ways that doesn't includes 3    let not_includes_3 = new Uint8Array(n + 1);     // Initially to reach 3 stairs by    // taking 3 steps can be    // reached by 1 way    includes_3[3] = 1;     not_includes_3[1] = 1;    not_includes_3[2] = 2;    not_includes_3[3] = 3;     // Loop to find the number    // the number of ways to reach Nth stair    for (let i = 4; i <= n; i++) {        includes_3[i]            = includes_3[i - 1] + includes_3[i - 2] + not_includes_3[i - 3];        not_includes_3[i]            = not_includes_3[i - 1] + not_includes_3[i - 2];    }    return includes_3[n];} // Driver Code     let n = 7;     document.write(number_of_ways(n));   // This code is contributed by Surbhi Tyagi. </script>
20
 
Similar Article: Count ways to reach Nth Stair using 1, 2 or 3 steps at a time 
mohit kumar 29
Rajput-Ji
princiraj1992
nidhi_biet
surbhityagi15
simranarora5sos
gulshankumarar231
combionatrics
Dynamic Programming
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count All Palindrome Sub-Strings in a String | Set 1
Optimal Substructure Property in Dynamic Programming | DP-2
Maximum sum such that no two elements are adjacent
Min Cost Path | DP-6
Optimal Binary Search Tree | DP-24
Maximum Subarray Sum using Divide and Conquer algorithm
3 Different ways to print Fibonacci series in Java
Greedy approach vs Dynamic programming
How to solve a Dynamic Programming Problem ?
Binomial Coefficient | DP-9