PROBLEM LINK:
Author: Zi Song Yeoh
DIFFICULTY:
EASY
PREREQUISITES:
Dynamic Programming
PROBLEM:
Given a binary string with some characters replaced with question marks. Find the number of ways to replace the question marks with 1 or 0 so that the resulting string has exactly k runs for all 1 \le k \le n.
EXPLANATION:
Firstly, the naive solution is to iterate through all possible binary strings and find the number of runs in each of them. This solution will work in O(2^{n} \cdot n) time.
Now, to get a faster solution, we need dynamic programming. Let dp[i][j][k] denote the number of ways to fill the question marks from digits 1 to i so that there are exactly j runs and the i-th digit is k. (so k = 0 or 1)
We can easily update the dp by considering all possible values of the current digit.
If the i-th digit can be 1, then dp[i][j][1] += dp[i - 1][j - 1][0] + dp[i - 1][j][1].
If the i-th digit can be 0, then dp[i][j][0] += dp[i - 1][j - 1][1] + dp[i - 1][j][0].
The time complexity of this solution is O(n^2).
AUTHOR’S AND TESTER’S SOLUTIONS:
Author’s solution can be found here.
Tester’s solution can be found here.