Probability of reaching a point with 2 or 3 steps at a time
Last Updated :
09 Nov, 2023
A person starts walking from position X = 0, find the probability to reach exactly on X = N if she can only take either 2 steps or 3 steps. Probability for step length 2 is given i.e. P, probability for step length 3 is 1 – P.
Examples :
Input : N = 5, P = 0.20
Output : 0.32
Explanation :-
There are two ways to reach 5.
2+3 with probability = 0.2 * 0.8 = 0.16
3+2 with probability = 0.8 * 0.2 = 0.16
So, total probability = 0.32.
It is a simple dynamic programming problem. It is simple extension of this problem :- count-ofdifferent-ways-express-n-sum-1-3-4
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
float find_prob( int N, float P)
{
double dp[N + 1];
dp[0] = 1;
dp[1] = 0;
dp[2] = P;
dp[3] = 1 - P;
for ( int i = 4; i <= N; ++i)
dp[i] = (P)*dp[i - 2] + (1 - P) * dp[i - 3];
return dp[N];
}
int main()
{
int n = 5;
float p = 0.2;
cout << find_prob(n, p);
return 0;
}
|
Java
import java.io.*;
class GFG {
static float find_prob( int N, float P)
{
double dp[] = new double [N + 1 ];
dp[ 0 ] = 1 ;
dp[ 1 ] = 0 ;
dp[ 2 ] = P;
dp[ 3 ] = 1 - P;
for ( int i = 4 ; i <= N; ++i)
dp[i] = (P) * dp[i - 2 ] +
( 1 - P) * dp[i - 3 ];
return (( float )(dp[N]));
}
public static void main(String args[])
{
int n = 5 ;
float p = 0 .2f;
System.out.printf( "%.2f" ,find_prob(n, p));
}
}
|
Python3
def find_prob(N, P) :
dp = [ 0 ] * (n + 1 )
dp[ 0 ] = 1
dp[ 1 ] = 0
dp[ 2 ] = P
dp[ 3 ] = 1 - P
for i in range ( 4 , N + 1 ) :
dp[i] = (P) * dp[i - 2 ] + ( 1 - P) * dp[i - 3 ]
return dp[N]
n = 5
p = 0.2
print ( round (find_prob(n, p), 2 ))
|
C#
using System;
class GFG {
static float find_prob( int N, float P)
{
double []dp = new double [N + 1];
dp[0] = 1;
dp[1] = 0;
dp[2] = P;
dp[3] = 1 - P;
for ( int i = 4; i <= N; ++i)
dp[i] = (P) * dp[i - 2] +
(1 - P) * dp[i - 3];
return (( float )(dp[N]));
}
public static void Main()
{
int n = 5;
float p = 0.2f;
Console.WriteLine(find_prob(n, p));
}
}
|
Javascript
<script>
function find_prob(N, P)
{
let dp = [];
dp[0] = 1;
dp[1] = 0;
dp[2] = P;
dp[3] = 1 - P;
for (let i = 4; i <= N; ++i)
dp[i] = (P) * dp[i - 2] +
(1 - P) * dp[i - 3];
return (dp[N]);
}
let n = 5;
let p = 0.2;
document.write(find_prob(n, p));
</script>
|
PHP
<?php
function find_prob( $N , $P )
{
$dp ;
$dp [0] = 1;
$dp [1] = 0;
$dp [2] = $P ;
$dp [3] = 1 - $P ;
for ( $i = 4; $i <= $N ; ++ $i )
$dp [ $i ] = ( $P ) * $dp [ $i - 2] +
(1 - $P ) * $dp [ $i - 3];
return $dp [ $N ];
}
$n = 5;
$p = 0.2;
echo find_prob( $n , $p );
?>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Efficient approach: Space optimization O(1)
In the previous approach, the current value dp[i] only depends on the previous 2 values of dp i.e. dp[i-2] and dp[i-3]. So to optimize the space complexity we can store the previous 4 values of Dp in 4 variables his way, the space complexity will be reduced from O(N) to O(1)
Implementation Steps:
- Initialize variables for dp[0], dp[1], dp[2], and dp[3] as 1, 0, P, and 1-P respectively.
- Iterate from i = 4 to N and use the formula dp[i] = (P)*dp[i – 2] + (1 – P) * dp[i – 3] to compute the current value of dp.
- After each iteration, update the values of dp0, dp1, dp2, and dp3 to dp1, dp2, dp3, and curr respectively.
- Return the final value of curr.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
float find_prob( int N, float P)
{
double curr;
double dp0 = 1, dp1=0, dp2=P, dp3= 1-P;
for ( int i = 4; i <= N; ++i){
curr = (P)*dp2 + (1 - P) * dp1;
dp0=dp1;
dp1=dp2;
dp2=dp3;
dp3=curr;
}
return curr;
}
int main()
{
int n = 5;
float p = 0.2;
cout << find_prob(n, p);
return 0;
}
|
Java
import java.util.*;
public class Main {
static float find_prob( int N, float P) {
double curr;
double dp0 = 1 , dp1 = 0 , dp2 = P, dp3 = 1 - P;
for ( int i = 4 ; i <= N; ++i) {
curr = (P) * dp2 + ( 1 - P) * dp1;
dp0 = dp1;
dp1 = dp2;
dp2 = dp3;
dp3 = curr;
}
return ( float ) curr;
}
public static void main(String[] args) {
int n = 5 ;
float p = 0 .2f;
System.out.println(find_prob(n, p));
}
}
|
Python3
def find_prob(N, P):
curr = 0.0
dp0, dp1, dp2, dp3 = 1.0 , 0.0 , P, 1 - P
for i in range ( 4 , N + 1 ):
curr = P * dp2 + ( 1 - P) * dp1
dp0, dp1, dp2, dp3 = dp1, dp2, dp3, curr
return round (curr, 2 )
if __name__ = = "__main__" :
n = 5
p = 0.2
print (find_prob(n, p))
|
C#
using System;
class Program
{
static double FindProbability( int N, double P)
{
double curr = 0.0;
double dp1 = 0.0, dp2 = P, dp3 = 1 - P;
for ( int i = 4; i <= N; i++)
{
curr = P * dp2 + (1 - P) * dp1;
dp1 = dp2;
dp2 = dp3;
dp3 = curr;
}
return curr;
}
static void Main()
{
int n = 5;
double p = 0.2;
Console.WriteLine(FindProbability(n, p));
}
}
|
Javascript
function find_prob(N, P) {
let curr;
let dp0 = 1, dp1 = 0, dp2 = P, dp3 = 1 - P;
for (let i = 4; i <= N; ++i) {
curr = (P * dp2) + ((1 - P) * dp1);
dp0 = dp1;
dp1 = dp2;
dp2 = dp3;
dp3 = curr;
}
return curr;
}
let n = 5;
let p = 0.2;
console.log(find_prob(n, p).toFixed(2));
|
Time complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...