- 论坛徽章:
- 0
|
原帖由 emacsnw 于 12/29/06 13:35 发表
这个有点意思,不妨说来听听,呵呵。
就是首先, 问题的最优解等于序列中元素的最大重复数, 这个容易证明.
然后我们考虑下面这个简单的情形:
不严格的说:
我们每次只需要把这个形状的天空线, 打印出来就行了
打印出来的值就删掉, 比如输出一个子序列后变成下面这样:
要实现这个,
我们维护一个链表, 这个链表就是当前这次扫描应该输出序列(不好意思...要描述还真是e...)
链表用Pi表示.
比如初始的时候P1=4, P4=5, P5=7, P7=8, P8=-1
然后每次输出元素的时候维护这个指针序列就行了, 检查一下是否对应的值已经用完, 没完就加1, 完了就推进, 相当于从链表中删掉结点, 设当前待输出子序列长度为k, 维护复杂度是O(k)的
由于每个元素最多被删一次, 用平摊分析可以得到输出完成的复杂度是O(n)
还可以添加一个在0位置的头元素, P0始终指向链表头, 方便统一处理.
而且初始的Pi可以在O(n)里完成
就是基于上面的算法, 可以看到Pi有界, 在[-1,n]中, 我们把小数部分分成[n+2]段, 就可以附加保存Pi了...
不考虑浮点误差的话...应该可以这样...
BTW: 如果直接打印也算辅助空间的话...暂时没辙了
cheat啊~~
Please correct me if I'm wrong. |
|