def extraSpace(S, M, i, j): """ Computes the number of extra characters at the end of the line. Between each word there is only once space. :param S: List of words :param M: Max length of line :param i: start word index :param j: end word index """ extraSpaces = M - j + i for x in range(i, j + 1): extraSpaces -= len(S[x]) return extraSpaces def badnessLine(S, M, i, j): """ Computes Line badness. This is the number of extra spaces or infinity if the length exceeds M :param S: List of words :param M: Max length of line :param i: start word index :param j: end word index """ es = extraSpace(S, M, i, j) if es < 0: return float("infinity") return es def minBad(S, M, i): """ Computes the badness of a paragraph as the badness of the worst line in the paragraph not including the last line. *this is recursive :param S: List of words :param M: Max length of line :param i: start word index """ if len(S) == 0: return 0 # Calculate the current line's badness curBad = 0 k = i while curBad > badnessLine(S, M, i, k): curBad = badnessLine(S, M, i, k) k = k + 1 return max(curBad, badnessLine(S, M, k)) def minBadDynamic(S, M): """ Write a procedure minBadDynamic that implements the function mb' using dynamic program- ming. It should take only two parameters: S and M :param S: List of words :param M: Max length of line """ pass def minBadDynamicChoice(S, M): """ Write a procedure minBadDynamicChoice that implements the function mb 0 using dynamic programming. In addition to returning mb(S, M ), it should also return the choices made :param S: List of words :param M: Max length of line """ pass def printParagraph(S, M): """ which takes two parameters: S and M that displays the words in S on the screen using the choices of minBadDynamicChoice. What is the asymptotic running time of your algorithm? :param S: List of words :param M: Max length of line """ pass