现在的位置: 首页 > 综合 > 正文

一道“最长递增子序列”问题

2014年01月19日 ⁄ 综合 ⁄ 共 336字 ⁄ 字号 评论关闭

某天,舟兄考了我一道题:一群人排队,每个人都朝一个方向,而且仰视,这意味着只能看到比自己高的人,而且一个高个子会挡着矮个子。现在给一堆整数,问队里,谁能看到的“高个子”最多。

如:0 4 7 2 5 3 2 6 7 8,能“看得最多”的序列是2 5 6 7 8。

 

一眼望去,真像“最长递增子序列”,按O(NlogN)的算法,结果应该是0 2 3 6 7 8。但 0 是看不到 2 的,因为被挡了。

 

此题用动态规划很容易解决,D[i]表示从队列最开始到第i个人,能看到第i个人的最长序列的长度。

初始 D[0] = 1;

递推 D[i+1] = max { D[j] +1 }, s<j<=i,     其中 s 满足:使D[s]是最后一个大于或等于D[i+1]的位置。

 

最后是 O(n^2) 的样子。比最长递增子序列的最优算法要差。暂不知能否提高。

【上篇】
【下篇】

抱歉!评论已关闭.