- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我们有这样一段:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
假设一个固定宽度的字体,我们想要恰好添加 N 个换行符(仅通过替换空格字符)来生成 N+1 行文本 block 。
这是 N=8 的输出示例,我们得到的最大线宽为 51:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa
qui officia deserunt mollit anim id est laborum.
我们如何找到用换行符替换哪些空格字符以获得最窄(最长行上的最少字符数)且尝试次数最少?
最佳答案
假设文本由 m 个单词组成,我们将从 1 到 m 编号。将 f(i, j) 定义为仅由前 i 个单词组成的子问题的最佳(最小宽度)解决方案中任何行的最大宽度(以字符为单位),条件是正好使用 j 个换行符。那么整个问题的最佳可能中断序列的宽度将由 f(m, n) 给出。这可以使用 dynamic programming 相当有效地解决。 .
设单词 i 和单词 j >= i 之间的片段的字符总长度为 len(i, j)。 (这很容易计算:只需计算一个包含 m+1 个值的数组 len0[j],其中 0 <= j <= m,每个值给出由前 j 个单词组成的片段的字符总长度;然后 len( i, j) 只是 len0[j] - len0[i-1] - 1,约定 len0[0] = -1。)
基本情况很简单:
f(i, 0) = len(0, i) (i.e., if there are no line breaks)
递归情况是:
f(i, j) = the minimum over all 0 <= k < i of max(f(k, j-1), len(k+1, i))
也就是说,要找到将前 i 个单词分成 j+1 行的最佳方法(即使用 j 个换行符),我们可以对每个较短的 k 字前缀尝试以下操作:确定最好的拆分方法k 词前缀到 j 行(即使用 j-1 换行符),并将我们从中获得的最大宽度与将其余 i-k 词放在最后一行的宽度进行比较。每个前缀都为我们提供了不同的候选解决方案,因此我们可以从中选出最好的。
现在我们可以计算最佳宽度 f(m, n),我们如何使用它来实际构建解决方案?幸运的是,在动态规划中有一个标准技术可以做到这一点。最快的方法是在计算 f(i, j) 的过程中,记录(实际上是 a,因为通常可能有多个最优解)k 的值在前导表中产生最小值预 [i][j]。计算出 f(m, n) 并填写前导表后,我们可以通过向后遍历它来构造一个最优解:pred[i][j] 告诉我们一个值 k,这样我们就可以通过添加在单词k之后有一个换行符,所以在那里添加一个换行符,然后查看pred[k][j-1]找到上一个换行符的位置,继续直到j到达0。
如果递归是memoised使用动态规划,那么最多有 O(mn) 个不同的参数组合可以调用 f()(i 的范围在 0 和 m 之间,j 的范围在 0 和 n 之间),并且递归调用之外花费的时间是O(m)(k 的取值范围为 0 到 m,k 的每个值的计算量为 O(1)),因此此解的时间复杂度为 O(nm^2)。 空间复杂度为 O(mn),但是通过切换到自下而上的 DP,这可以很容易地减少到 O(m),因为在计算 f(i, j) 我们只需要访问第二个参数为 j-1 的 f() 的值,这意味着实际存储计算值 f(q, j-1) 的 size-(m+1) 数组就足够了对于 0 <= q <= m。
关于arrays - 在一个段落中添加 N 个换行符以获得最窄的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596511/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!