算法导论_动态规划一节中的课后习题之整齐打印

题目要求如下:

 输入文本为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最小的那个就可以了。

 

到此,这个问题得到解决。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值