 Open in App
Not now

# Find the probability of reaching all points after N moves from point N

• Difficulty Level : Hard
• Last Updated : 23 Jan, 2023

Given N which denotes the initial position of the person on the number line. Also given L which is the probability of the person of going left. Find the probability of reaching all points on the number line after N moves from point N. Each move can be either to the left or to the right.

Examples:

Input: n = 2, l = 0.5
Output: 0.2500 0.0000 0.5000 0.0000 0.2500
The person can’t reach n-1th position and n+1th position in 2 passes, hence the probability is 0. The person can reach 0th position by only moving 2 steps left from index 2, hence the probability of reaching 0th index is 05*0.5=0.25. Similarly for 2n index, the probability is 0.25.

Input: n = 3, l = 0.1
Output: 0.0010 0.0000 0.0270 0.0000 0.2430 0.0000 0.7290
The person can reach n-1th in three ways, i.e., (llr, lrl, rll) where l denotes left and r denotes right. Hence the probability of n-1th index is 0.027. Similarly probabilities for all other points are also calculated.

Approach: Construct an array arr[n+1][2n+1] where each row represents a pass and the columns represent the points on the line. The maximum a person can move from index N is to 0th index at left or to 2nth index at right. Initially the probabilities after one pass will be left for arr[n-1] and right for arr[n+1]. The n-1 moves which are left will be done, hence the two possible moves will either be n steps to the right or n steps to the left. So the recurrence relations for right and left moves for all will be:

arr[i][j] += (arr[i – 1][j – 1] * right)
arr[i][j] += (arr[i – 1][j + 1] * left)

The summation of probabilities for all possible moves for any index will be stored in arr[n][i].

Below is the implementation of the above approach:

## C++

 `// C++ program to calculate the``// probability of reaching all points``// after N moves from point N``#include ``using` `namespace` `std;` `// Function to calculate the probabilities``void` `printProbabilities(``int` `n, ``double` `left)``{``    ``double` `right = 1 - left;` `    ``// Array where row represent the pass and the``    ``// column represents the points on the line``    ``double` `arr[n + 1][2 * n + 1] = {{0}};` `    ``// Initially the person can reach left``    ``// or right with one move``    ``arr[n + 1] = right;``    ``arr[n - 1] = left;` `    ``// Calculate probabilities for N-1 moves``    ``for` `(``int` `i = 2; i <= n; i++)``    ``{``        ``// when the person moves from ith index in``        ``// right direction when i moves has been done``        ``for` `(``int` `j = 1; j <= 2 * n; j++)``            ``arr[i][j] += (arr[i - 1][j - 1] * right);` `        ``// when the person moves from ith index in``        ``// left direction when i moves has been done``        ``for` `(``int` `j = 2 * n - 1; j >= 0; j--)``            ``arr[i][j] += (arr[i - 1][j + 1] * left);``    ``}` `    ``// Print the arr``    ``for` `(``int` `i = 0; i < 2*n+1; i++)``        ``printf``(``"%5.4f "``, arr[n][i]);``}` `// Driver Code``int` `main()``{``    ``int` `n = 2;``    ``double` `left = 0.5;``    ``printProbabilities(n, left);``    ``return` `0;``}` `/* This code is contributed by SujanDutta */`

## Java

 `// Java program to calculate the``// probability of reaching all points``// after N moves from point N``import` `java.util.*;``class` `GFG {` `    ``// Function to calculate the probabilities``    ``static` `void` `printProbabilities(``int` `n, ``double` `left)``    ``{``        ``double` `right = ``1` `- left;` `        ``// Array where row represent the pass and the``        ``// column represents the points on the line``        ``double``[][] arr = ``new` `double``[n + ``1``][``2` `* n + ``1``];` `        ``// Initially the person can reach left``        ``// or right with one move``        ``arr[``1``][n + ``1``] = right;``        ``arr[``1``][n - ``1``] = left;` `        ``// Calculate probabilities for N-1 moves``        ``for` `(``int` `i = ``2``; i <= n; i++) {` `            ``// when the person moves from ith index in``            ``// right direction when i moves has been done``            ``for` `(``int` `j = ``1``; j <= ``2` `* n; j++) {``                ``arr[i][j] += (arr[i - ``1``][j - ``1``] * right);``            ``}` `            ``// when the person moves from ith index in``            ``// left direction when i moves has been done``            ``for` `(``int` `j = ``2` `* n - ``1``; j >= ``0``; j--) {``                ``arr[i][j] += (arr[i - ``1``][j + ``1``] * left);``            ``}``        ``}``        ``// Calling function to print the array with probabilities``        ``printArray(arr, n);``    ``}` `    ``// Function that prints the array``    ``static` `void` `printArray(``double``[][] arr, ``int` `n)``    ``{``        ``for` `(``int` `i = ``0``; i < arr[``0``].length; i++) {``            ``System.out.printf(``"%5.4f "``, arr[n][i]);``        ``}``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `n = ``2``;``        ``double` `left = ``0.5``;``        ``printProbabilities(n, left);``    ``}``}`

## Python3

 `# Python3 program to calculate the``# probability of reaching all points``# after N moves from point N` `# Function to calculate the probabilities``def` `printProbabilities(n, left):``    ` `    ``right ``=` `1` `-` `left;`` ` `    ``# Array where row represent the pass``    ``# and the column represents the``    ``# points on the line``    ``arr ``=` `[[``0` `for` `j ``in` `range``(``2` `*` `n ``+` `1``)]``              ``for` `i ``in` `range``(n ``+` `1``)]`` ` `    ``# Initially the person can reach``    ``# left or right with one move``    ``arr[``1``][n ``+` `1``] ``=` `right;``    ``arr[``1``][n ``-` `1``] ``=` `left;`` ` `    ``# Calculate probabilities``    ``# for N-1 moves``    ``for` `i ``in` `range``(``2``, n ``+` `1``):``    ` `        ``# When the person moves from ith``        ``# index in right direction when i``        ``# moves has been done``        ``for` `j ``in` `range``(``1``, ``2` `*` `n ``+` `1``):``            ``arr[i][j] ``+``=` `(arr[i ``-` `1``][j ``-` `1``] ``*` `right);`` ` `        ``# When the person moves from ith``        ``# index in left direction when i``        ``# moves has been done``        ``for` `j ``in` `range``(``2` `*` `n ``-` `1``, ``-``1``, ``-``1``):``            ``arr[i][j] ``+``=` `(arr[i ``-` `1``][j ``+` `1``] ``*` `left);``    ` `    ``# Print the arr``    ``for` `i ``in` `range``(``2` `*` `n ``+` `1``):``        ``print``(``"{:5.4f} "``.``format``(arr[n][i]), end ``=` `' '``);` `# Driver code   ``if` `__name__``=``=``"__main__"``:``    ` `    ``n ``=` `2``;``    ``left ``=` `0.5``;``    ` `    ``printProbabilities(n, left);``    ` `# This code is contributed by rutvik_56`

## C#

 `// C# program to calculate the``// probability of reaching all points``// after N moves from point N``using` `System;` `class` `GFG``{` `    ``// Function to calculate the probabilities``    ``static` `void` `printProbabilities(``int` `n, ``double` `left)``    ``{``        ``double` `right = 1 - left;` `        ``// Array where row represent the pass and the``        ``// column represents the points on the line``        ``double``[,] arr = ``new` `double``[n + 1,2 * n + 1];` `        ``// Initially the person can reach left``        ``// or right with one move``        ``arr[1,n + 1] = right;``        ``arr[1,n - 1] = left;` `        ``// Calculate probabilities for N-1 moves``        ``for` `(``int` `i = 2; i <= n; i++)``        ``{` `            ``// when the person moves from ith index in``            ``// right direction when i moves has been done``            ``for` `(``int` `j = 1; j <= 2 * n; j++)``            ``{``                ``arr[i, j] += (arr[i - 1, j - 1] * right);``            ``}` `            ``// when the person moves from ith index in``            ``// left direction when i moves has been done``            ``for` `(``int` `j = 2 * n - 1; j >= 0; j--)``            ``{``                ``arr[i, j] += (arr[i - 1, j + 1] * left);``            ``}``        ``}``        ``// Calling function to print the array with probabilities``        ``printArray(arr, n);``    ``}` `    ``// Function that prints the array``    ``static` `void` `printArray(``double``[,] arr, ``int` `n)``    ``{``        ``for` `(``int` `i = 0; i < GetRow(arr,0).GetLength(0); i++)``        ``{``            ``Console.Write(``"{0:F4} "``, arr[n,i]);``        ``}``    ``}``    ` `    ``public` `static` `double``[] GetRow(``double``[,] matrix, ``int` `row)``    ``{``        ``var` `rowLength = matrix.GetLength(1);``        ``var` `rowVector = ``new` `double``[rowLength];` `        ``for` `(``var` `i = 0; i < rowLength; i++)``            ``rowVector[i] = matrix[row, i];` `        ``return` `rowVector;``    ``}``    ` `    ``// Driver Code``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``int` `n = 2;``        ``double` `left = 0.5;``        ``printProbabilities(n, left);``    ``}``}` `/* This code contributed by PrinciRaj1992 */`

## Javascript

 `// Function to calculate the probabilities``function` `printProbabilities(n, left) {``    ``let right = 1 - left;` `    ``// Array where row represent the pass and the``    ``// column represents the points on the line``    ``let arr = ``new` `Array(n + 1);``    ``for` `(let i = 0; i < n + 1; i++) {``        ``arr[i] = ``new` `Array(2 * n + 1).fill(0);``    ``}` `    ``// Initially the person can reach left``    ``// or right with one move``    ``arr[n + 1] = right;``    ``arr[n - 1] = left;` `    ``// Calculate probabilities for N-1 moves``    ``for` `(let i = 2; i <= n; i++)``    ``{``    ` `        ``// when the person moves from ith index in``        ``// right direction when i moves has been done``        ``for` `(let j = 1; j <= 2 * n; j++) {``            ``arr[i][j] += (arr[i - 1][j - 1] * right);``        ``}` `        ``// when the person moves from ith index in``        ``// left direction when i moves has been done``        ``for` `(let j = 2 * n - 1; j >= 0; j--) {``            ``arr[i][j] += (arr[i - 1][j + 1] * left);``        ``}``    ``}` `    ``// Print the arr``    ``for` `(let i = 0; i < 2*n+1; i++) {``        ``console.log(`\${arr[n][i].toFixed(4)} `);``    ``}``}` `// Driver Code``    ``let n = 2;``    ``let left = 0.5;``    ``printProbabilities(n, left);` `// This code is contributed by lokeshpotta20.`

Output:

`0.2500 0.0000 0.5000 0.0000 0.2500`

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

My Personal Notes arrow_drop_up