关于spoj的LIS2的方法

时间:2013-06-29 08:32:55

标签: algorithm data-structures

我正在解决在http://www.spoj.com/problems/LIS2/.I遇到的问题LIS2 2D段树,但我想它不适合这个问题。我读到misof解决方案 关于spoj的NICEDAY,根据这篇文章类似于这个问题: http://apps.topcoder.com/forums/;jsessionid=F39EBDDC41BEB792536BE044ADC8BA2A?module=Thread&threadID=615154&start=0&mc=2。 我也不能理解这两个问题之间的联系,我也无法理解 错误解决NICEDAY的复杂性。

PS:我不想要整个解决方案我也不希望任何方法通过2D段树, 因为这个问题太复杂了(我试过了)

2 个答案:

答案 0 :(得分:1)

想想如何解决一维问题:

dp[i] = longest increasing subsequence that ends at position i.

对于每个i,我们必须将a[i]附加到j,以使dp[j]最大且a[j] < a[i]。通过更改dp数组的定义:

,我们可以使用高级数据结构有效地找到它
dp[i] = longest increasing subsequence that ends with the VALUE i

现在,最初dp[ a[i] ] = 1代表每个职位i。然后,对于每个元素a[i],您需要最多dp[0], dp[1], ..., dp[ a[i] - 1 ]。然后你有dp[ a[i] ] = mx + 1

您可以通过规范化数组值来找到此最大值(确保它们都在[1, n]区间内)。你可以这样做。例如,如果您的数组为42 562 13,则n = 3和您的新数组将为2 3 1

这可以通过支持查询和更新最大值的分段树轻松实现。时间复杂度为O(n log n)

通过使用2D细分树,可以很容易地扩展这个问题,获得时间复杂度O(n log^2 n),这根本不应该太复杂。这涉及使用其节点也是分段树的分段树。

答案 1 :(得分:0)

对我来说,我认为我们不能使用2D Segment Tree来解决这个问题,因为对于2D Segment Tree来说,我们需要最多10 ^ 5 x 10 ^ 5的表,这个表太大了。