对于一个应用程序,我想找到一种方法,可以通过惩罚段落的每一行末尾的总空白空间来最小化。我有一组单词W = [w1, w2, w3, ..., wn]
构成了文本,我希望该段落包含该文本并使每个单词wi
都具有相应的长度li
。我也知道一行可以容纳的最大字符数(包括空格):m
。我无法理解单词。
在这种情况下,我定义了一个关系,该关系描述了以i
开头的单词j
到以c(i, j) = (m - (j - i) - sum_{k=i}^{k = j}lk)^3
结尾的行的空白空间的代价。因此,c(i, j)
必须为正,否则我需要换行,并且如果j = n
,我不会惩罚最后一行的空白:c(i, n) = 0
。
使用此参数,我找到了一种算法,该算法可将每一行的成本降至最低,然后再传递至下一行并计算总成本。但是,将每条生产线的成本降至最低并不一定意味着总成本也已降至最低。
我能想到的任何使总成本最小化的过程都需要在每一行中对单词数量进行大量排列,因此无法实现。有什么可行的算法来计算最低成本的想法吗?
答案 0 :(得分:1)
让 G 为图,其中每个顶点 V_x_y 代表由 y 行组成的部分段落,这些行总共使用 x 个字。如果 z> x 和单词 w_(x + 1),则图形的边线从 V_x_y 到 V_z_(y + 1) 至 w_z 排成一行。每个此类边的成本为 c(x + 1,z),即它代表的附加行的成本。
现在,您的问题是找到从 V_0_0 到消耗所有单词的顶点 V_n_y 的成本最低的路径。
您可以使用Dijkstra的算法在 O(n ^ 2 log n)时间或更短的时间内找到此路径,或者,如果制定了体面的允许启发式算法,则可以使用A *更快地找到它。