我只是想知道我在之前的算法测试中遇到的问题。问题是关于一个男孩写作和散文。他希望最大化以'r'结尾的行数,因为他认为这会在他的论文中产生更高的等级(什么......)。
无论如何,论文的限制是每行的最后72-80个字符需要在其中包含一个字母,除非包含下一个单词在一行上超过80个字符(例如,我们可以有一行没有字母)如果添加下一个单词,则72-80个字符点将使该行有80个以上的字符)或者它是最后一行(最后一行可以少于72个字符)。
例如,如果约束为10-15而不是72-80,则格式如下所示:
123456789012345
The slow blue
dog is
entertaining
是否有一种有效的算法可以在保持72-80字母约束的同时最大化以字母'r'结尾的行数?我们不能剪切整个单词以便以“r”结尾。
我尝试使用的算法是这样做的:
我对这个贪婪算法的主要问题是第2步。尽可能多地填充该行有可能以“r”结束未来的结束行。
使用具有10-15约束的此算法将得到:
123456789012345
The man was in
the backgarden
or the yard
但最佳解决方案是:
123456789012345
The man was
in the
backgarden or
the yard
:(
答案 0 :(得分:2)
这可以通过动态编程解决方案来完成。
给文本中的每个单词一个分数,如果文本以该单词开头(即如果你删除了之前的所有内容),则该分数是以'r'结尾的最大行数。
因此,例如,最后一个单词的分数将为0或1(取决于它是否以'r'结尾)。第一个单词的分数就是你需要的答案。
通过查看从上到下的单词来计算分数。对于给定的单词,分析创建第一行的所有可能性。对于给定的可能性,分数将是第二行中第一个单词的分数,如果第一行以'r'结尾则加1。给定单词的分数将是最佳可能性的分数。
使用示例文本,“该男子在后院或院子里”:
yard: score 0
the: score 0
or: score 0 (only possibility for first line is "or the yard")
backgarden: score 1 (there are two possibilities for first line, the better one
is "backgarden or" which gives the score of "the" plus 1).
the: score 0 (only possibility for first line is "the backgarden")
in: score 1 (first line is "in the" which gives the score of "backgarden")
was: score 1
man: score 1 (first line is either "man was in" or "man was in the". The second
option gives the score of "backgarden" which is 1.
The: score 1 (best first line is "The man was" which gives the score of "in").
在计算得分后,要构建最佳的行分隔文本,从第一个单词开始,为第一行选择最佳可能性(如上所述),并用下一行的第一个单词重复。 / p>