Я пытаюсь понять концепцию динамического программирования через курс MIT OCW здесь. Объяснение по видео в OCW великолепен и все, но я чувствую, что не понимаю его до тех пор, пока не внедрил объяснение в код. Во время реализации я ссылаюсь на некоторые примечания из лекции здесь, особенно на стр. 3 примечания.
Проблема в том, что я не знаю, как перевести некоторые математические обозначения в код. Вот часть решения, которое я реализовал (и думаю, что оно реализовано правильно):
import math
paragraph = "Some long lorem ipsum text."
words = paragraph.split(" ")
# Count total length for all strings in a list of strings.
# This function will be used by the badness function below.
def total_length(str_arr):
total = 0
for string in str_arr:
total = total + len(string)
total = total + len(str_arr) # spaces
return total
# Calculate the badness score for a word.
# str_arr is assumed be send as word[i:j] as in the notes
# we don't make i and j as argument since it will require
# global vars then.
def badness(str_arr, page_width):
line_len = total_length(str_arr)
if line_len > page_width:
return float('nan')
else:
return math.pow(page_width - line_len, 3)
Теперь часть, которую я не понимаю, находится в пунктах 3-5 в лекциях. Я буквально не понимаю и не знаю, с чего начать их внедрять. До сих пор я пробовал перебирать список слов и считал, что каждый из них якобы заканчивается, например:
def justifier(str_arr, page_width):
paragraph = str_arr
par_len = len(paragraph)
result = [] # stores each line as list of strings
for i in range(0, par_len):
if i == (par_len - 1):
result.append(paragraph)
else:
dag = [badness(paragraph[i:j], page_width) + justifier(paragraph[j:], page_width) for j in range(i + 1, par_len + 1)]
# Should I do a min(dag), get the index, and declares it as end of line?
Но тогда я не знаю, как я могу продолжить эту функцию, и, честно говоря, я не понимаю эту строку:
dag = [badness(paragraph[i:j], page_width) + justifier(paragraph[j:], page_width) for j in range(i + 1, par_len + 1)]
и как я вернусь justifier
как int
(так как я уже решил сохранить возвращаемое значение в result
, что является списком. Должен ли я делать еще одну функцию и рекурсировать оттуда? рекурсия вообще?
Не могли бы вы показать мне, что делать дальше, и объяснить, как это динамическое программирование? Я действительно не вижу, где рекурсия, и что такое подзадача.
Спасибо раньше.