Count ways to reach end from start stone with at most K jumps at each step - GeeksforGeeks

24 Nov, 2021
Given N stones in a row from left to right. From each stone, you can jump to at most K stones. The task is to find the total number of ways to reach from sth stone to Nth stone.Examples:  
Input: N = 5, s = 2, K = 2 Output: Total Ways = 3 Explanation: Assume s1, s2, s3, s4, s5 be the stones. The possible paths from 2nd stone to 5th stone: s2 -> s3 -> s4 -> s5 s2 -> s4 -> s5 s2 -> s3 -> s5 Hence total number of ways = 3Input: N = 8, s = 1, K = 3 Output: Total Ways = 44  
 
Approach:  
Let assume dp[i] be the number of ways to reach ith stone.Since there are atmost K jumps, So the ith stone can be reach by all it’s previous K stones.Iterate for all possible K jumps and keep adding this possible combination to the array dp[].Then the total number of possible ways to reach Nth node from sth stone will be dp[N-1].For Example:  
Let assume dp[i] be the number of ways to reach ith stone.
Since there are atmost K jumps, So the ith stone can be reach by all it’s previous K stones.
Iterate for all possible K jumps and keep adding this possible combination to the array dp[].
Then the total number of possible ways to reach Nth node from sth stone will be dp[N-1].
For Example:  
Let N = 5, s = 2, K = 2, then we have to reach Nth stone from sth stone. Let dp[N+1] is the array that stores the number of paths to reach the Nth Node from sth stone. Initially, dp[] = { 0, 0, 0, 0, 0, 0 } and dp[s] = 1, then dp[] = { 0, 0, 1, 0, 0, 0 } To reach the 3rd, There is only 1 way with at most 2 jumps i.e., from stone 2(with jump = 1). Update dp[3] = dp[2] dp[] = { 0, 0, 1, 1, 0, 0 }To reach the 4th stone, The two ways with at most 2 jumps i.e., from stone 2(with jump = 2) and stone 3(jump = 1). Update dp[4] = dp[3] + dp[2] dp[] = { 0, 0, 1, 1, 2, 0 }To reach the 5th stone, The two ways with at most 2 jumps i.e., from stone 3(with jump = 2) and stone 4(with jump = 1). Update dp[5] = dp[4] + dp[3] dp[] = { 0, 0, 1, 1, 2, 3 }Now dp[N] = 3 is the number of ways to reach Nth stone from sth stone.  
 
 
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ program to find total no.of ways// to reach nth step#include "bits/stdc++.h"using namespace std; // Function which returns total no.of ways// to reach nth step from sth stepsint TotalWays(int n, int s, int k){    // Initialize dp array with 0s.    vector<int> dp(n,0);      // Initialize (s-1)th index to 1    dp[s - 1] = 1;     // Iterate a loop from s to n    for (int i = s; i < n; i++) {         // starting range for counting ranges        int idx = max(s - 1, i - k);         // Calculate Maximum moves to        // Reach ith step        for (int j = idx; j < i; j++) {            dp[i] += dp[j];        }    }     // For nth step return dp[n-1]    return dp[n - 1];} // Driver Codeint main(){    // no of steps    int n = 5;     // Atmost steps allowed    int k = 2;     // starting range    int s = 2;    cout << "Total Ways = "         << TotalWays(n, s, k);}
// Java program to find total no.of ways// to reach nth stepclass GFG{  // Function which returns total no.of ways// to reach nth step from sth stepsstatic int TotalWays(int n, int s, int k){    // Initialize dp array    int []dp = new int[n];      // Initialize (s-1)th index to 1    dp[s - 1] = 1;      // Iterate a loop from s to n    for (int i = s; i < n; i++) {          // starting range for counting ranges        int idx = Math.max(s - 1, i - k);          // Calculate Maximum moves to        // Reach ith step        for (int j = idx; j < i; j++) {            dp[i] += dp[j];        }    }      // For nth step return dp[n-1]    return dp[n - 1];}  // Driver Codepublic static void main(String[] args){    // no of steps    int n = 5;      // Atmost steps allowed    int k = 2;      // starting range    int s = 2;    System.out.print("Total Ways = "         + TotalWays(n, s, k));}} // This code is contributed by sapnasingh4991
# Python 3 program to find total no.of ways# to reach nth step # Function which returns total no.of ways# to reach nth step from sth stepsdef TotalWays(n, s, k):     # Initialize dp array    dp = [0]*n     # Initialize (s-1)th index to 1    dp[s - 1] = 1     # Iterate a loop from s to n    for i in range(s, n):         # starting range for counting ranges        idx = max(s - 1, i - k)         # Calculate Maximum moves to        # Reach ith step        for j in range( idx, i) :            dp[i] += dp[j]     # For nth step return dp[n-1]    return dp[n - 1] # Driver Codeif __name__ == "__main__":    # no of steps    n = 5     # Atmost steps allowed    k = 2     # starting range    s = 2    print("Total Ways = ", TotalWays(n, s, k))     # This code is contributed by chitranayal
// C# program to find total no.of ways// to reach nth stepusing System; class GFG{          // Function which returns total no.of ways    // to reach nth step from sth steps    static int TotalWays(int n, int s, int k)    {        // Initialize dp array        int []dp = new int[n];              // Initialize (s-1)th index to 1        dp[s - 1] = 1;              // Iterate a loop from s to n        for (int i = s; i < n; i++) {                  // starting range for counting ranges            int idx = Math.Max(s - 1, i - k);                  // Calculate Maximum moves to            // Reach ith step            for (int j = idx; j < i; j++) {                dp[i] += dp[j];            }        }              // For nth step return dp[n-1]        return dp[n - 1];    }          // Driver Code    public static void Main(string[] args)    {        // no of steps        int n = 5;              // Atmost steps allowed        int k = 2;              // starting range        int s = 2;        Console.Write("Total Ways = "+ TotalWays(n, s, k));    }} // This code is contributed by Yash_R
<script>// Javascript program to find total no.of ways// to reach nth step  // Function which returns total no.of ways// to reach nth step from sth stepsfunction TotalWays(n, s, k){    // Initialize dp array    let dp = new Array(n);     // filling all the elements with 0    dp.fill(0);     // Initialize (s-1)th index to 1    dp[s - 1] = 1;     // Iterate a loop from s to n    for (let i = s; i < n; i++) {         // starting range for counting ranges        let idx = Math.max(s - 1, i - k);         // Calculate Maximum moves to        // Reach ith step        for (let j = idx; j < i; j++) {            dp[i] += dp[j];        }    }     // For nth step return dp[n-1]    return dp[n - 1];} // Driver Code      // no of steps    let n = 5;     // Atmost steps allowed    let k = 2;     // starting range    let s = 2;    document.write("Total Ways = " + TotalWays(n, s, k));     // This code is contributed by _saurabh_jaiswal</script>
Total Ways = 3
 
Time Complexity: O(N2), where N is the number of stones.Auxiliary Space: O(N) 
ukasp
sapnasingh4991
Yash_R
_saurabh_jaiswal
pankajsharmagfg
ashutoshsinghgeeksforgeeks
Algorithms
Arrays
Dynamic Programming
Arrays
Dynamic Programming
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Introduction to Algorithms
How to write a Pseudo Code?
Playfair Cipher with Examples
Arrays in Java
Arrays in C/C++
Program for array rotation
Stack Data Structure (Introduction and Program)
Largest Sum Contiguous Subarray