题目要求如下:
输入文本为n个单词的序列,单词长度分别为a_1,a_2,...,a_n 个字符。我们希望将此段文本整齐打印在若干行上。每行最多M个字符。“整齐”的标准时这样的:如果某行包哈第i到第j个单词,且单词之间为一个空格,则行尾的额外空格符数量为 M - a_i - ... - a_j - j + i。此值必然为非负的,否则一行内无法容纳这些单词。我们希望能最小化所有行(最后一行除外)额外空格数的立方之和。设计一个动态规划算法。
我开始的时候,没有注意到题目中的“最后一行除外”。下面博客分两部分:忽略“最后一行除外”;包含“最后一行除外”
忽略“最后一行除外”:
给出一个直观的例子:
M = 6;
A = {4, 1, 2};
排列方式有多种,给出代表的两种:
I)
4 1
2
II)
4
1 2
第I种方式下的立方和为4 ^ 3 = 64
第II种方式下的立方和为2 ^ 3 + 2 ^ 3 = 16
第II种方式是最优解。
下面给出算法的递推公式:
编程实现是非常容易的。
包含“最后一行除外”
该情况实际是上面情况的一种变形。
一共有n个单词,可以假设最后一行有k个单词,这样,前n-k个单词可以按照上面的方法计算最小值。当然,根据M和单词长度,k可以取不同的值。从不同的值中,选择minQ最小的那个就可以了。
到此,这个问题得到解决。