CLRS 15-2 整齐打印
来源:互联网 发布:手机直播平台系统源码 编辑:程序博客网 时间:2024/05/16 18:48
考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是n个长度分别为L1、L2、……、Ln(以字符个数度量)的单词构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符。“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格字符个数为 M - (j-i) - (Li+ …… + Lj),它必须是非负值才能让该行容纳这些单词。我们希望所有行(除最后一行)的行末多余空格字符个数的立方和最小。请给出一个动态规划的算法,来在打印机整齐地打印一段又n个单词的文章。分析所给算法的执行时间和空间需求。
解答:
定义remain[i, j] = M - j + i - ∑lk ,其中k = i, ..., j,表示余下的空格数
定义cube[i, j],表示每行空格数的立方值,MAX表示无穷大
|------>MAX 当remain[i, j] < 0时
cube[i, j] = |------>0 当j == n,且remain[i, j] >= 0 (其实这里表示的就是最后一行)
|------>(remain[i, j])3 非上述两种情况时
定义所有立方之和sum[i],假设sum[j]表示的是1,...,j这j个单词的最优排列(即所求立方和最小),那么在最后一行,假设是i,...,j这些单词,那么sum[j] = sum[i-1] + cube[i, j]。
|------>0 if j == 0
sum[j] = |
|------>min(sum[i - 1] + cube[i - 1, j] if j > 0,其中1 <= i <= j
1 GET-REMAIN() 2 { 3 for (i = 1; i <= n; i++) 4 remain[i, i] = M - li; 5 for (j = i + 1; j <= n; j++) 6 remain[i, j] = remain[i, j-1] - lj - 1; 7 } 8 9 GET-CUBE()10 {11 for (i = 1; i <= n; i++)12 for (j = i; j <= n; j++)13 {14 if (remain[i, j] < 0)15 cube[i, j] = MAX;16 else if (j==n && remain[i, j]>=0)17 cube[i, j] = 0;18 else19 cube[i, j] = (remain[i, j])3;20 }21 }22 23 GET-SUM()24 {25 sum[0] = 0;26 for (j = 1; j <= n; j++)27 {28 sum[j] = MAX;29 for (i = 1; i <= j; i++)30 if (sum[i-1] + cube[i, j] < sum[j])31 {32 sum[j] = sum[i-1] + cube[i, j];33 p[j] = i;//用数组p来记录换行的位置34 }35 }36 }
- CLRS 15-2 整齐打印
- 算法导论 15-2 整齐打印
- 算法导论-15-2-整齐打印
- 算法导论思考题答案 思考题15-2 整齐打印
- 整齐打印
- 整齐打印
- 算法导论 思考题 15-4(整齐打印)
- 动态规划--整齐打印
- 动态规划--整齐打印
- 动态规划--整齐打印
- 动态规划--整齐打印
- 整齐打印乘法表
- 整齐打印-DP
- 算法导论第三版15-4整齐打印Printing neatly
- 动态规划之整齐打印
- 动态规划之整齐打印
- 动态规划之整齐打印
- Solution to CLRS Chapter 2
- sql server 2008 sa账户无法登录,错误:233
- 张小龙:如何把产品做简单
- ST算法求RMQ问题
- HDU 1002 A + B Problem II
- 数据库的信息显示在网页上
- CLRS 15-2 整齐打印
- chmod命令及其用法
- hibernate 如何实现延迟加载
- 上海爱立信实习笔试面试
- 你必须知道的 34 个简单实用的 Ubuntu 快捷键
- HDU 1003 Max Sum
- 一套书上、下两册共有777个数码,并且上册比下册多7页,上册有多少页?(
- 单链表的排序
- 有一座寺庙有 8 级台阶,李明从下向上走,若每次叧能跨过一级或两级,他走上去有多少种不同方法