【发布时间】:2013-08-14 13:37:12
【问题描述】:
我正在尝试通过 MIT OCW here 上的课程了解动态编程的概念。 OCW视频的解释很棒,但我觉得直到我将解释实现到代码中我才真正理解它。在实现时,我参考了讲义here中的一些笔记,特别是笔记的第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 中,这是一个列表。我应该创建另一个函数并从那里递归吗?应该有递归?
能否请您告诉我下一步该做什么,并解释一下这是如何动态编程的?我真的看不出递归在哪里,以及子问题是什么。
之前谢谢。
【问题讨论】:
-
这个链接比你正在使用的链接读起来更清晰,虽然下标可能有点难以阅读(很难区分 'i' 和 '1'):cs.nyu.edu/courses/fall11/CSCI-GA.1170-003/TextAlignment.pdf
-
@AlexSilva 好的,如果我有什么想法,我会先阅读并更新问题/答案。感谢您的链接。
标签: algorithm python-3.x dynamic-programming