动态编程:最小化空白

时间:2013-04-03 17:55:40

标签: dynamic-programming

这是一个家庭作业问题,但我完全迷失了。我有一个不可能的时间弄清楚子问题是什么:我尝试过一种贪婪的方法,我已经尝试在一条线上建立了一些单词等等,我无法想出任何东西。任何人都可以提供任何见解吗?

问题:考虑一个将单词列表转换为typset文本的程序。程序将字打印到长度为W的行上,使得行尾的额外空格量使得包含单词i到j的行包含W-j + i-SUM(单词i到j中的字符)。编写一个动态编程算法,最大限度地减少每行额外空格的平方和。

2 个答案:

答案 0 :(得分:0)

我相信你应该采用的方法如下:

- >为长度为1的行找到最佳解决方案并保存该值。(这应该是微不足道的。)

- >以这种方式为长度为2的行找到最佳解决方案:

对于每个单词,看看它们是否合适。如果他们确实计算剩余空间并使用该空间的最佳解决方案(将剩下1或0个空格)。

......(一直到W)

- >以这种方式为长度为W的线找到最佳解决方案:

对于每个单词,看看它们是否合适。如果他们这样做,计算剩余空间并使用该剩余空间的最佳解决方案(因为它小于您已经计算过的W。)

答案 1 :(得分:0)

动态编程是开发人员轻松解决此类问题的理想选择。

我们可以用来解决这个问题的动态编程方法如下。首先,如果所有单词都适合一行,那么我们就完成了。             如果没有,那么我们将尝试所有可能适合这一行的可能组合,然后我们解决由该组成的子问题            对于每种可能的组合的剩余单词,我们可以通过最小化第一行的成本并添加最小值来找到最佳布局            其余子问题的成本。

  

让MAX(i)成为最大的j   enter image description here,意思是单词j可以放在以单词i开头的行上。               我们可以填充成本c的n元素数组,其中c [i]是打印单词i到n的最小成本,如下所示:               如果MAX(i)= n,则c [i] = 0否则:enter image description here               
从n到1从上到下填充数组,将花费O((M / 2)n)时间,因为最多M / 2个单词可以放在一条线上。所需空间为O(n)。