云淡风轻
Stay foolish,stay hungry.
考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是n个长度分别l[1], l[2], ..., l[n](以字符个数度量)的单词构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符。“整齐度”的标准如下。如果某一行包含从i到j的单词,i<j,且单词之间只留一个空,则在行末多余的空格字符个数为M-j+i-∑(k=i to j)l[k],它必须是非负值才能让该行容纳这些单词。我们希望所有行(除了最后一行)的行末多余空格字符个数的立方的总和最小。请给出一个动态规划算法,来在打印机上整齐地打印出一段有n个单词的文章。分析所给算法的执行时间和空间需求。
解答:我们用C[i]表示用单词1,..,i打印后每行空格数立方和的最小值,由题意知,当我们用第i个单词到第j个单词打印某一行时,其剩余空格的数目是R[i,j]=M-j+i-∑(k=i to j)l[k],那么我们用W[i,j]=R[i,j]^3表示其剩余空格的立方(注意如果,R[i,j]<0,那么W[i,j]=+无穷,表示这一行不能容纳单词i到j。)所以我们知道状态转换方程为:
C[i]=min{C[r]+R[r+1,i]| 1=<r<i},初始化为:
C[0]=0;C[1]=W[1,1]; 如果j=n,并且R[i,j]>0,那么W[i,j]=0,表示最后一行代价不算。最终就是要求c[n]的值。
posted on 2011-12-07 21:50  kevin Lee  阅读(392)  评论(0编辑  收藏  举报