设为首页 加入收藏

TOP

hdu 2227 Find the nondecreasing subsequences (二)
2014-11-23 19:37:57 来源: 作者: 【 】 浏览:14
Tags:hdu 2227 Find the nondecreasing subsequences
(2) 自己单独成一个子序列 num[2]++ = 2


对于第三个数 300: 以 3 结尾形成的不下降子序列: (1) 加到前面形成的子序列的后面 num[3] = num[1] + num[2] = 3
(2) 自己单独成一个 num[3]++ = 4
那么最后的结果就是 7
是否体会到原来要开到的数组 dp[300], 现在 num[3] 就解决了, 这就是传说中的离散化。。。


PS :其实这个思路并不严谨,稍微改下数据就会有很多错误的地方,只是为了清楚离散化就先用了。。。严谨看后面。
因为我排序后,忽略了每一个元素在原来的序列中出现的位置就直接把大的插入到了小的后面。
这样就会陷入这样一个误区:变成了子序列的个数 = 元素个数的非空子集个数,照成最后的结果变成 pow(2, n) - 1而这样是错的。
解决这样的先后处理问题就必须用到树状数组的思想,先不管这个问题,直接考虑对于这题如何离散化。


对于这题如何离散:




离散化就是排序下,再随便处理下就 O 了。


思路一:


定义一个结构体, 记录每一个元素的初始下标 index 和元素的值 value
等我先写完思路了再具体介绍为何还要定义下标【这里先提一下, 方便后面嵌入树状数组】

对元素的值 value 从小到大排序【前面已经分析过】
对于 value 一样的按照 index由小到大排序 【这一点下面会解释】



还是以上面的 num[] 数组记录的思想来解释:

3
1 3 3

如果只对 value 排序
那么排序后原来的元素的下标的排列可能会出现两种情况:


情况一: 1 2 3 【这样是正确的】


num[1] = 1
num[2] = num[1]+1 = 1 + 1 = 2
num[3] = num[1] + num[2] + 1 = 1+2 +1 = 4

最后的结果为 1 + 2 + 4 = 7

情况二: 1 3 2 【错误】


num[1] = 1
num[2] = num[1] + 1 = 1 + 1 = 2
num[3] = num[1] + 1 = 2

最后的结果为 1 + 2 + 2 = 5 WA

为什么对于情况一的 num[3] 要加上 num[2] 但是情况二的 num[3] 却没有 ?



这里就要说下为何用树桩数组 如何用树桩数组了 ,而不是直接的简单相加就好了.


再次强调一下树桩数组的作用:快速更新每一个元素的值, 快速求出任意一段连续子序列的和。


为了应用于树桩数组:每次求 num[i] 应该转换成 num[i] = num[1] + ... +num[i-1] +1
从而借用树状数组快速求前缀和的思想求出 num[i] ,
但是如果仅仅是这样,好像无法体现到树桩数组的优越性而且也陷入了上面解释离散化的映射时出现的误区
不要忘了,树桩数组还有一个优越性:快速更新每个元素的值。

如果排序后,我们遍历到第 i 个元素时求的不是 num[i] 而是 a[i] 原来对应的编号 index 的 num[index] 来记
录以 a[i] 结尾的不下降子序列的个数是不是就解决了前面的误区问题。


直接对元素的 a[i] 原来未排序时的编号做 num 处理。

3

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ3207+Tarjan+2-sat 下一篇Dragons

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)