最大化用字母r完成的行数

时间:2013-12-02 00:35:05

标签: algorithm

我只是想知道我在之前的算法测试中遇到的问题。问题是关于一个男孩写作和散文。他希望最大化以'r'结尾的行数,因为他认为这会在他的论文中产生更高的等级(什么......)。

无论如何,论文的限制是每行的最后72-80个字符需要在其中包含一个字母,除非包含下一个单词在一行上超过80个字符(例如,我们可以有一行没有字母)如果添加下一个单词,则72-80个字符点将使该行有80个以上的字符)或者它是最后一行(最后一行可以少于72个字符)。

例如,如果约束为10-15而不是72-80,则格式如下所示:

123456789012345

The slow blue  
dog is  
entertaining

是否有一种有效的算法可以在保持72-80字母约束的同时最大化以字母'r'结尾的行数?我们不能剪切整个单词以便以“r”结尾。

我尝试使用的算法是这样做的:

  1. 从72开始检查当前行的72-80字母“r”。
  2. 如果72-80中没有字母“r”,我们会尽量尽量填写该行,然后转到下一行。
  3. 如果72-80中有一个字母“r”,我们就会结束这条线。
  4. 重复1,直到没有更多行。
  5. 我对这个贪婪算法的主要问题是第2步。尽可能多地填充该行有可能以“r”结束未来的结束行。

    使用具有10-15约束的此算法将得到:

    123456789012345
    The man was in 
    the backgarden  
    or the yard
    

    但最佳解决方案是:

    123456789012345
    The man was 
    in the 
    backgarden or 
    the yard
    

    :(

1 个答案:

答案 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>