Count number of ways to jump to reach end - GeeksforGeeks

26 Apr, 2021
Given an array of numbers where each element represents the max number of jumps that can be made forward from that element. For each array element, count the number of ways jumps can be made from that element to reach the end of the array. If an element is 0, then a move cannot be made through that element. The element that cannot reach the end should have a count “-1”. 
Examples:
Input : {3, 2, 0, 1}
Output : 2 1 -1 0
For 3 number of steps or jumps that 
can be taken are 1, 2 or 3. The different ways are:
3 -> 2 -> 1
3 -> 1

For 2 number of steps or jumps that 
can be taken are 1, or 2. The different ways are:
2 -> 1

For 0 number of steps or jumps that 
can be taken are 0. 
One cannot move forward from this point.

For 1 number of steps or jumps that 
can be taken are 1. But the element is at
the end so no jump is required.

Input : {1, 3, 5, 8, 9, 1, 0, 7, 6, 8, 9}
Output : 52 52 28 16 8 -1 -1 4 2 1 0
This problem is a variation of the Minimum number of jumps to reach end(Method 3). Here we need to count all the ways to reach the end from every cell.The solution is a modified version of the solution to the problem of the Minimum number of jumps to reach end(Method 3). This problem aims to count the different ways to jump from each element to reach the end. For each element, the count is being calculated by adding the counts of all those forward elements that can reach the end and to which the current element could reach + 1(if the element can directly reach the end).
Algorithm: 
countWays(arr, n)
    Initialize array count_jump[n] = {0}

    count_jump[n-1] = 0
    for i = n-2 to 0
        if arr[i] >= (n-i-1)
         count_jump[i]++
        for j=i+1; j < n-1 && j <= arr[i]+i; i++
          if count_jump[j] != -1
             count_jump[i] += count_jump[j]
        if count_jump[i] == 0
         count_jump[i] = -1

    for i = 0 to n-1
        print count_jump[i]
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation to count number// of ways to jump to reach end#include <bits/stdc++.h>using namespace std; // function to count ways to jump to// reach end for each array elementvoid countWaysToJump(int arr[], int n){    // count_jump[i] store number of ways    // arr[i] can reach to the end    int count_jump[n];    memset(count_jump, 0, sizeof(count_jump));     // Last element does not require to jump.    // Count ways to jump for remaining    // elements    for (int i=n-2; i>=0; i--)    {        // if the element can directly        // jump to the end        if (arr[i] >= n - i - 1)            count_jump[i]++;         // add the count of all the elements        // that can reach to end and arr[i] can        // reach to them        for (int j=i+1; j < n-1 && j <= arr[i] + i; j++)             // if element can reach to end then add            // its count to count_jump[i]            if (count_jump[j] != -1)                 count_jump[i] += count_jump[j];         // if arr[i] cannot reach to the end        if (count_jump[i] == 0)            count_jump[i] = -1;    }     // print count_jump for each    // array element    for (int i=0; i<n; i++)        cout << count_jump[i] << " ";} // Driver program to test aboveint main(){    int arr[] = {1, 3, 5, 8, 9, 1, 0, 7, 6, 8, 9};    int n = sizeof(arr) / sizeof(arr[0]);    countWaysToJump(arr, n);    return 0;}
// Java implementation to count number// of ways to jump to reach endimport java.util.Arrays; class GFG {         // function to count ways to jump to    // reach end for each array element    static void countWaysToJump(int arr[], int n)    {                 // count_jump[i] store number of ways        // arr[i] can reach to the end        int count_jump[] = new int[n];        Arrays.fill(count_jump, 0);             // Last element does not require to jump.        // Count ways to jump for remaining        // elements        for (int i = n-2; i >= 0; i--)        {                         // if the element can directly            // jump to the end            if (arr[i] >= n - i - 1)                count_jump[i]++;                 // add the count of all the elements            // that can reach to end and arr[i] can            // reach to them            for (int j = i+1; j < n-1 && j <= arr[i] + i; j++)                     // if element can reach to end then add                // its count to count_jump[i]                if (count_jump[j] != -1)                    count_jump[i] += count_jump[j];                 // if arr[i] cannot reach to the end            if (count_jump[i] == 0)                count_jump[i] = -1;        }             // print count_jump for each        // array element        for (int i = 0; i < n; i++)            System.out.print(count_jump[i] + " ");    }         //driver code    public static void main (String[] args)    {                 int arr[] = {1, 3, 5, 8, 9, 1, 0, 7, 6, 8, 9};        int n = arr.length;                 countWaysToJump(arr, n);    }} // This code is contributed by Anant Agarwal.
# Python3 implementation to count# number of ways to jump to reach end # Function to count ways to jump to# reach end for each array elementdef countWaysToJump(arr, n):     # count_jump[i] store number of ways    # arr[i] can reach to the end    count_jump = [0 for i in range(n)]     # Last element does not require    # to jump. Count ways to jump for    # remaining elements    for i in range(n - 2, -1, -1):             # if the element can directly        # jump to the end        if (arr[i] >= n - i - 1):            count_jump[i] += 1         # Add the count of all the elements        # that can reach to end and arr[i]        # can reach to them        j = i + 1        while(j < n-1 and j <= arr[i] + i):             # if element can reach to end then            # add its count to count_jump[i]            if (count_jump[j] != -1):                count_jump[i] += count_jump[j]            j += 1                     # if arr[i] cannot reach to the end        if (count_jump[i] == 0):            count_jump[i] = -1          # print count_jump for each    # array element    for i in range(n):        print(count_jump[i], end = " ") # Driver codearr = [1, 3, 5, 8, 9, 1, 0, 7, 6, 8, 9]n = len(arr)countWaysToJump(arr, n) # This code is contributed by Anant Agarwal.
// C# implementation to count number// of ways to jump to reach endusing System; class GFG {         // function to count ways to jump to    // reach end for each array element    static void countWaysToJump(int[] arr, int n)    {                 // count_jump[i] store number of ways        // arr[i] can reach to the end        int[] count_jump = new int[n];                 for(int i = 0; i < n; i++)            count_jump[i] = 0;                      // Last element does not require to jump.        // Count ways to jump for remaining        // elements        for (int i = n-2; i >= 0; i--)        {                         // if the element can directly            // jump to the end            if (arr[i] >= n - i - 1)                count_jump[i]++;                 // add the count of all the elements            // that can reach to end and arr[i] can            // reach to them            for (int j = i+1; j < n-1 && j <= arr[i] + i; j++)                     // if element can reach to end then add                // its count to count_jump[i]                if (count_jump[j] != -1)                    count_jump[i] += count_jump[j];                 // if arr[i] cannot reach to the end            if (count_jump[i] == 0)                count_jump[i] = -1;        }             // print count_jump for each        // array element        for (int i = 0; i < n; i++)            Console.Write(count_jump[i] + " ");    }         // Driver code    public static void Main ()    {        int[] arr = {1, 3, 5, 8, 9,                 1, 0, 7, 6, 8, 9};        int n = arr.Length;        countWaysToJump(arr, n);    }} // This code is contributed by ChitraNayal
<?php// PHP implementation to count number// of ways to jump to reach end // function to count ways to jump to// reach end for each array elementfunction countWaysToJump($arr, $n){    // count_jump[i] store number of ways    // arr[i] can reach to the end    $count_jump;    for($i = 0; $i < $n; $i++)        $count_jump[$i] = 0;     // Last element does not require to jump.    // Count ways to jump for remaining    // elements    for ($i = $n - 2; $i >= 0; $i--)    {        // if the element can directly        // jump to the end        if ($arr[$i] >= $n - $i - 1)            $count_jump[$i]++;         // add the count of all the elements        // that can reach to end and arr[i]        // can reach to them        for ($j = $i + 1; $j < $n - 1 &&             $j <= $arr[$i] + $i; $j++)             // if element can reach to end then            // add its count to count_jump[i]            if ($count_jump[$j] != -1)                $count_jump[$i] += $count_jump[$j];         // if arr[i] cannot reach to the end        if ($count_jump[$i] == 0)            $count_jump[$i] = -1;    }     // print count_jump for each    // array element    for ($i = 0; $i < $n; $i++)        echo $count_jump[$i] . " ";} // Driver Code$arr = array(1, 3, 5, 8, 9, 1,                0, 7, 6, 8, 9);$n = count($arr);countWaysToJump($arr, $n); // This code is contributed by Rajput-Ji?>
<script> // Javascript implementation to count number// of ways to jump to reach end         // function to count ways to jump to    // reach end for each array element    function countWaysToJump(arr,n)    {        // count_jump[i] store number of ways        // arr[i] can reach to the end        let count_jump = new Array(n);        for(let i=0;i<n;i++)        {            count_jump[i]=0;        }               // Last element does not require to jump.        // Count ways to jump for remaining        // elements        for (let i = n-2; i >= 0; i--)        {                           // if the element can directly            // jump to the end            if (arr[i] >= n - i - 1)                count_jump[i]++;                   // add the count of all the elements            // that can reach to end and arr[i] can            // reach to them            for (let j = i+1; j < n-1 && j <= arr[i] + i; j++)                       // if element can reach to end then add                // its count to count_jump[i]                if (count_jump[j] != -1)                    count_jump[i] += count_jump[j];                   // if arr[i] cannot reach to the end            if (count_jump[i] == 0)                count_jump[i] = -1;        }               // print count_jump for each        // array element        for (let i = 0; i < n; i++)            document.write(count_jump[i] + " ");    }         //driver code    let arr=[1, 3, 5, 8, 9, 1, 0, 7, 6, 8, 9];    let n = arr.length;    countWaysToJump(arr, n);                   // This code is contributed by avanitrachhadiya2155</script>
Output: 
52 52 28 16 8 -1 -1 4 2 1 0
Time Complexity: O(n2) in worst case. 
ukasp
Rajput-Ji
lakshaygupta2807
avanitrachhadiya2155
Arrays
Dynamic Programming
Arrays
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Window Sliding Technique
Trapping Rain Water
Reversal algorithm for array rotation
Building Heap from Array
Program to find sum of elements in a given array
0-1 Knapsack Problem | DP-10
Program for Fibonacci numbers
Longest Common Subsequence | DP-4
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16