Problem #114 concerns partitioning a row of blocks with contiguous red sections and contiguous grey sections. The question reads:
My solution for this problem involves dynamic programming. Here’s my solution:
Solution #1: Dynamic Programming Approach
It suffices to recursively find the number of ways a row of n units can be filled such that the last square is red and the number of ways a row of n units can be filled such that the last square is grey. If the number of ways ending in a red square is a_n and the number of ways ending in a grey square is b_n, then a_n = b_(n-3)+b_(n-2) + … + b_0 and b_n = a_(n-1) + b_(n-1). Thus, with these recursions, the values of a_50 and b_50 can be determined, and the answer is simply a_50+b_50. Giving initial values of a_0, a_1, a_2, a_3, b_0, b_1, b_2, and b_3, it is easy to dynamically find the answer. Here is an implementation of this approach in Python 2.7:
''' Author: Walker Kroubalkian Dynamic Approach to Project Euler Problem #114 ''' import time def projectEulerProblemOneHundredFourteen(n): rTotals = [0,0,0,1] gTotals = [1,1,1,1] sumG = sum(gTotals) l = len(gTotals) while(l<=n+1): rValue = sumG - gTotals[l-1]-gTotals[l-2] gValue = rTotals[l-1]+gTotals[l-1] rTotals.append(rValue) gTotals.append(gValue) sumG+=gValue l+=1 return rTotals[n]+gTotals[n] start = time.time() print projectEulerProblemOneHundredFourteen(50) print ("--- %s seconds ---" % (time.time()-start)) ''' Prints 16475640049 --- 3.40938568115e-05 seconds --- for input of n = 50. '''
And with that, we’re done. This is a great example of the powers of dynamic programing. Over 16 billion cases could be counted in under a tenth of a millisecond.
Thanks for reading! See you tomorrow.