Tôi đang cố gắng hiểu khái niệm về Lập trình động, thông qua khóa học về MIT OCW here. Lời giải thích về video OCW thật tuyệt vời và tất cả, nhưng tôi cảm thấy như tôi không thực sự hiểu nó cho đến khi tôi thực hiện lời giải thích thành mã. Trong khi triển khai, tôi tham khảo một số ghi chú từ bài giảng here, đặc biệt là trang 3 của ghi chú.Thực hiện biện minh văn bản với lập trình động
Vấn đề là, tôi không biết cách dịch một số ký hiệu toán học thành mã. Dưới đây là một phần giải pháp mà tôi đã triển khai (và nghĩ rằng nó đã được triển khai đúng):
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)
Bây giờ phần tôi không hiểu là từ 3 đến 5 trong bài giảng. Tôi thực sự không hiểu và không biết bắt đầu triển khai ở đâu. Cho đến nay, tôi đã thử lặp lại danh sách các từ và tính mức độ xấu của mỗi dòng bị cáo buộc là như sau:
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?
Nhưng sau đó, tôi không biết làm thế nào tôi có thể tiếp tục chức năng và phải trung thực, tôi không hiểu dòng này:
dag = [badness(paragraph[i:j], page_width) + justifier(paragraph[j:], page_width) for j in range(i + 1, par_len + 1)]
và làm thế nào tôi sẽ trở lại justifier
như một int
(kể từ khi tôi đã quyết định để lưu trữ giá trị trả về trong result
, mà là một danh sách tôi có nên thực hiện một. chức năng và recurse từ đó? Nên có bất kỳ đệ quy nào cả?
Bạn có thể vui lòng cho tôi biết phải làm gì tiếp theo không và giải thích đây là chương trình động? Tôi thực sự không thể nhìn thấy nơi đệ quy là, và những gì các subproblem được.
Cảm ơn trước đây.
Liên kết này đọc một chút rõ ràng hơn thì một trong những bạn đang làm việc tắt, mặc dù các subscript có thể là một chút khó khăn để đọc (khó nói 'i' từ '1'): http://cs.nyu.edu/courses/fall11/CSCI-GA.1170 -003/TextAlignment.pdf – AlexSilva
@AlexSilva OK, tôi sẽ đọc nó trước và cập nhật câu hỏi/câu trả lời nếu tôi nghĩ ra điều gì đó. Cảm ơn các liên kết. – bertzzie