- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经通过许多在线资源来了解问题如何具有最优子结构,但都是徒劳的,我无法理解在这种情况下如何通过解决更小的子问题来获得解决方案。
如果任何解释有助于理解解决方案,我将不胜感激。
到目前为止,我对最优子结构性质的理解如下:
示例阶乘:
因此对于 40 的阶乘,fact(40),我们可以通过计算 fact(39)*40 来获得解决方案,对于 39,38....2 我们知道 fact(2),依此类推是 2 我们可以用同样的方法从 2 增加到 40。
但是我无法在LIS方面进行关联,请帮助
解决方案的完整解释会很好,不包括重叠的子问题问题,因为这可以稍后处理。
谢谢。
最佳答案
序列(问题)的 LIS 可以通过对较小序列(子问题)使用 LIS 来解决,这就是为什么已知它具有最佳子结构的原因。
让我试着解释一下这个例子是如何工作的。让我们取一个由 10 个数字组成的随机序列:
[21, 24, 13, 48, -3, 41, 36, 8, -10, 22]
我们将使用更小的问题(更小的序列)来解决这个问题。在这种情况下,子问题的定义是“以给定元素结尾的最长递增数字序列是什么?”
重要的是要了解此子问题与 LIS 不同 - 子问题具有比原始问题更严格的定义(LIS 不需要在最后一个元素处结束)。
出于可读性目的,我将调用“在给定元素处结束的最长递增子序列”:LIS*。
LIS*与LIS的关系是LIS取LIS*的Max
让我们从一个数字开始。
[21]
以 21 结尾的最长递增子序列是什么?它只是“21”。因此我们序列的长度是 1。
序列:[21]
LIS*: 1
LIS:1
现在,对于第二个元素 (24),根据定义,我们需要使用已经解决的问题的解决方案。我们将对第一个元素使用 LIS,检查第二个元素是否更大 (a[i] > a[j
) 以及是否 LIS[j]+1 > LIS[i]
。以 24 结尾的最长递增序列是 '21, 24',长度为 2。
序列:[21, 24]
LIS*: 2
LIS:2
让我们来看第三个元素 (13)。以 13 结尾的最长递增子序列是什么?好吧,13 小于 21 且小于 24,因此条件 a[i] > a[j]
不满足任何前面的元素。因此,以 13 结尾的最长递增子序列是只是 '13' 并且长度为 1。序列 21,24,13 的 LIS 仍然是 2。
序列:[21, 24, 13]
LIS*: 1
LIS:2
让我们看一下第 4 个元素 (48)。我们知道 3 长度序列的解是 2。我们可以找到满足条件 a[i] > a[j]
和 LIS[j]+ 的前一个元素 (24) 1 > LIS[i]
。我们知道前一个元素(较小的问题)的解是 2,因此这里的解是 2+1=3。
序列:[21, 24, 13, 48]
LIS*:3
LIS:3
我们对所有后续元素重复该逻辑。
序列:[21, 24, 13, 48, -3, 41, 36, 8, -10, 22]
LIS*: 1 2 1 3 1 3 3 2 1 3
LIS: 1 2 2 3 3 3 3 3 3 3
如您所见,可以通过查看子问题(较小的序列)获得原始问题(长序列)的解,因此已知该问题具有最优子结构。
关于algorithm - 无法理解最长递增子序列的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43232734/
我正在实现一个算法,当用户输入字符串时,字符串中的每个字符(如果是字母表)都应该增加给定的值(这里是旋转器)。我正在玩这个代码 2 小时,但无法弄清楚为什么当我按值旋转器递增时,它会按 rotator
我有 1.0.5。我怎样才能增加到 1.0.6? 试过了,但是不行。 echo 1.0.5 0.0.1 | awk '{sum=$1+$2; printf"%0.2f\n", sum }' 最佳答案
这个问题在这里已经有了答案: Behaviour of increment and decrement operators in Python (11 个回答) Why are there no ++
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试温习我的 C,我有以下代码,当我使用 i 偏移量但不使用 Hold++ 时,它可以工作,我不明白为什么我认为他们做了同样的事情?这是我无法开始工作的版本: char* reversestri
我需要增加/减少 PostgreSQL 数据库中的计时。 下面是包含列类型为"timestamp without time zone" 的表的输出 如果时间超过 24 小时,我也需要更改日期。请协助
我有一个名为 temp_rfm 的表,其中 col1 实际上是客户 ID(我有一个非法的联盟混合问题)和 calc_date 是增加月份的开始。 SELECT * FROM temp_rfm ; co
我目前正在处理我的应用程序的首选项,我必须设置一个角度。默认值约为 30°,用户应该能够调整此角度以使其最适合。 我不只是制作一个普通的 EditTextPreference,而是希望它可以像在其他应
这个问题已经有答案了: Increment a number by prefix and postfix operator (1 个回答) 已关闭去年。 我正在努力理解 Javascript 增量运算
我使用下面的 javascript 递归地重新加载一个目标 DIV,其 id="outPut",将参数传递给 getData.php 时执行数据查询的结果>。问题是 fadeTo 会淡化每次迭代调用返
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Jquery Draggable + Bring to Front 我有一个网站,用户可以在其中打开多个聊天
我必须定义一个函数,其中: Starting with a positive integer original, keep multiplying original by n and calculat
我正在我的应用程序中记录一些统计数据。其中一项统计数据是 BigDataStructure 的大小。我有两个选择: 创建一个计数器并递增/每次递减计数器有一个添加/删除大数据结构。 每次添加/删除从
在下面的 Java 示例程序中,我得到了无限循环,我不明白为什么: public class Time { public static int next(int v) { re
我从 C#/WPF 添加了一个意外的行为 private void ButtonUp_Click(object sender, RoutedEventArgs e) {
我想在 Python 2.7 中增加用户提供的字符串的最后一位数字。 我可以这样替换第一个数字: def increment_hostname(name): try: numb
我正在用蛮力搜索具有某些属性的 float (sin(a)^2+cos(a)^2-1 的小舍入误差)。因此,我想通过递增尾数来遍历给定 float 的邻域。 在 C 中是否有一种简单的方法可以做到这一
C 标准将 _Bool 定义为包含 0 或 1 的无符号类型。如果 _Bool 类型的值 1 递增,据我所知,有两个选项: 该值在 1 到 0 之间环绕 该值增加到 2,它是非零值,因此在转换回 _B
我有一个 INI 文件,其中存储了一些用于设置的整数。部分名称存储如下: [ColorScheme_2] name=Dark Purple Gradient BackgroundColor=224 B
我的应用程序中有这个方法: - (void)initializeTimer{ self.myTimer = [NSTimer scheduledTimerWithTimeInterval:th
我是一名优秀的程序员,十分优秀!