Back to challenges
Easy 0 solved 0% acceptance

Markov Chain State Distribution

Propagate a probability distribution through a Markov chain's transition matrix for a number of steps.

What you'll learn

  • Propagate a probability distribution
  • Multiply by a transition matrix
  • See long-run behavior emerge

Problem

A Markov chain moves between states at random, and the next state depends only on the current one. transition[i][j] is the probability of moving from state i to state j, so every row sums to 1.

If p is the probability of being in each state now, the distribution one step later is:

p_next[j] = Σ over i of p[i] × transition[i][j]

Implement markov_distribution(transition, start, steps) and apply this update steps times.

Input

transition: An n × n matrix whose rows sum to 1.

start: The starting distribution (n values summing to 1).

steps: How many steps to take.

Output

Return the distribution after steps steps.

Constraints

1 ≤ n ≤ 50, 0 ≤ steps ≤ 1,000

0 ≤ each probability ≤ 1

Examples

Example 1
Input:
start = [1.0, 0.0]
steps = 2
transition = [
    [0.9, 0.1],
    [0.5, 0.5]
]

Expected output:
expected = [0.86, 0.14]
Input:
std::vector<double> start = {1.0, 0.0};
long long steps = 2;
std::vector<std::vector<double>> transition = {
    {0.9, 0.1},
    {0.5, 0.5}
};

Expected output:
std::vector<double> expected = {0.86, 0.14};
Input:
double[] start = new double[] {1.0, 0.0};
long steps = 2;
double[][] transition = new double[][] {
    new double[] {0.9, 0.1},
    new double[] {0.5, 0.5}
};

Expected output:
double[] expected = new double[] {0.86, 0.14};

Explanation

Think of sunny (0) and rainy (1) days, starting sunny. After one step: [0.9, 0.1]. After two: sunny = 0.9 × 0.9 + 0.1 × 0.5 = 0.86 and rainy = 0.9 × 0.1 + 0.1 × 0.5 = 0.14.

Example 2
Input:
start = [0.25, 0.75]
steps = 3
transition = [
    [0.0, 1.0],
    [1.0, 0.0]
]

Expected output:
expected = [0.75, 0.25]
Input:
std::vector<double> start = {0.25, 0.75};
long long steps = 3;
std::vector<std::vector<double>> transition = {
    {0.0, 1.0},
    {1.0, 0.0}
};

Expected output:
std::vector<double> expected = {0.75, 0.25};
Input:
double[] start = new double[] {0.25, 0.75};
long steps = 3;
double[][] transition = new double[][] {
    new double[] {0.0, 1.0},
    new double[] {1.0, 0.0}
};

Expected output:
double[] expected = new double[] {0.75, 0.25};

Explanation

This chain always switches state, so each step swaps the two probabilities. After 3 swaps: [0.75, 0.25].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

The next distribution is found by sending probability mass through every transition from the current distribution.

Hint 2

Think of it as repeated matrix-vector multiplication, one step at a time.

Hint 3

When steps is zero, the starting distribution should be returned unchanged.

Expected complexity

O(steps * n^2) time, O(n) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.