I've successfully solved this problem using Greedy Approach but in the editorial it was given that the probelm can also be solved using Dynamic Programming.
Can someone help me with the DP solution ? (preferably in C++)
Problem Link : http://codeforces.net/problemset/problem/489/B
Editorial Link : http://codeforces.net/blog/entry/14741
My Solution ( Greedy ) : 39216236
First, sort arrays
a
andb
.Let
dp[i][j]
be the answer if we have onlya[0..i]
andb[0..j]
.dp[i][j]
is maximum of:0
1
if|a[i]-b[j]|<=1
dp[i-1][j-1]+1
ifi-1>=0
,j-1>=0
and|a[i]-b[j]|<=1
dp[i-1][j]
ifi-1>=0
dp[i][j-1]
ifj-1>=0
Answer will be
dp[n-1][m-1]
.My Solution: 39227258
Can we do an O(n) dp ?
Can we solve the problem Online (without brute-forces) ?
Here is my shorter dp solution O(n * m) ~ vector dp(n + 1, vi(m + 1, 0)); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) dp[i][j] = max({dp[i-1][j], dp[i][j-1], dp[i-1][j-1] + (abs(boy[i-1] — girl[j-1]) <= 1)}); ~
Can we dp in O(n) if we use frequency array ?