[POJ 1093]

Formatting Text

DP

题意:输入行长度值n,以及一篇文章,要将文章重新排版,使得”坏值”和最小。若某行只含一个单词,则坏值为500。包含多个单词的行,单词间每个长度为k的间隔,其坏值为(k-1)^2。

这题之前做CLRS时见过类似的(第二版习题15-2),当时也是想了很久才推出公式:用dp[i][j]保存到第i行结束时,打印了前j个单词的最小坏值。那么dp[i][j]=min{dp[i-1][k-1]+bd[n-sum{w[l]|k<=l<=j}][j-k]},其中w[l]为第l个单词的长度,bd[p][q]为预处理计算出来的一行有p个空格和q个间隔时的坏值。状态转移时注意下标边界,并需要记录父状态。这里对于相同坏值的方案,要输出使各间隔长度值字典序最小的,那么每次dp使,总是使更多单词尽量在之前打印即可。 输出时,首先找到最小坏值对应的行数,根据父状态一层层回退,记录每行要打印多少个单词;然后逐个单词处理输出即可。

ps: 这题考察的算法貌似很有实用价值呢……不过现在的文本处理程序,恐怕是要比这复杂十倍以上的吧……