spiralgo / algorithms

We voluntarily solve algorithm problems on this repo.
24 stars 7 forks source link

1259. Handshakes That Don't Cross #378

Closed ErdemT09 closed 3 years ago

ErdemT09 commented 3 years ago

Resolves: #216

Algorithm:

What happens here is that each hand shake divides the group into 2 distinct groups. The total number of handshakes for this division would then be handshakes for the one group times the handshakes for the other group, by the multiplication principle. To count the number of such divisions, we can choose a person like person 1 to be the pivot. This person can shake hands with person 2, 4, 6, ..., n-2, n. Shaking hands with person k would seperate the group into the groups of size k-2 and n-k. This also equivalent to calling the handshake function with values 0, 2, 4, ..., n-4, n-2. We can derive a recurrence relation from this:

The recursive formula should look something like this:

handshakes(n) := hs(n)
hs(0) := 1
hs(2) := 1
hs(n) := sum( hs(2*a)*hs(n-2*(a+1)), 0≤a≤(n/2-1) ) 
= hs(0)*hs(n-2) + hs(2)*hs(n-4) + hs(4)*hs(n-6) ... + hs(n-2)*hs(0)
From this, we can check:
hs(4) = hs(0)*hs(2)+hs(2)*hs(0) = 2 (true)
hs(6) = hs(0)*hs(4)+hs(2)*hs(2)+hs(4)*hs(0) = 5 (true)
where hs(n) ≡ Catalan(n/2)

We can implement this using recursion with memoization as well as dynamic programming.

altay9 commented 3 years ago

IMG-1713