[2010-8-28]

  1.辛辛苦苦,终于A过了1631。尽管是一条对其他人来说很简单的题目,但我还是花了好长时间去想,不愿意看别人做法,也不愿意看别人代码。求一个序列里面的最长递增离散序列。使用动态规划,长度为i的序列中的最长递增离散序列长度为F[i] = max{F[k1],F[k2]...F[kn]} + 1 where kj < i and n[kj] < n[i]。就是这个挑max的过程,如果采用朴素手段将会是         O(n^2),这题目一定要达到O(nlgn),花了好长的时间,还出动了红黑树,但最后才发现,还是会搜索很多节点,最坏情况下还是O(n^2);在discuss看到有个人说用线段树过了,天呐,我连什么是线段树都不知道,去学呗。学了以后,知道了线段树其实就是用叶节点保存元素,其他内部节点(包括最终根节点)表示区间,这个区间包含着对应子树下所有叶节点的元素,而这些内部节点就是用于统计区间内叶节点的信息,那不就正是统计最大值的好方法吗,还可以lgN查询插入,于是一次A过。截图庆祝!

下一步去看看别人的其他做法。

posted @ 2010-08-28 09:17  DOF_KL  阅读(134)  评论(0编辑  收藏  举报