算法描述部分转自:点击打开链接
''' 乍一看以为是空格个数和,如此可以使用“贪心算法”求解,即从第一行开始尽可能多的放置单词,可以证明这个“贪心解”也是最优的,假设有一个最优解从某行开始和“贪心解”不相同,我们可以从这行开始进行构造证明,将下一行的某些单词拿到行尾来使得当前行为“贪心解”,如此“贪心解”的行数必定不大于“最优解”,如此命题得证。
此处的空格立方和,有点类似数学期望的方差,指的是希望所有行的末尾空格看起来尽可能的整齐,即排版感觉上最整齐。举例来说,如果两行的行尾空格总数为5,则空格以2、3(35)分布时立方和最小,1、4分布时立方和(129)相当大。为简单起见,可以对每个单词的长度加1,行的长度也加1,于是就不用考虑单词之间的空格了。
此题的动态规划非常直接,可惜个人刚开始不敢想啊(非常感谢网络友人的无私奉献)!设M(i)为第1个单词到第i个单词的最优排版方案,考虑此方案的最后一行,有以下的递推公式:
M(i) = MIN(M(k)+ left_sp