An alternating monotonic sequence (AMS) is a monotonically increasing sequence which alternates between even and odd numbers. For example, {7,12,13,22} is an AMS, but {7,12,14,21} is not (though it is a monotonic sequence). Describe a dynamic program for finding a longest alternating monotonic subsequence of a given sequence.
这是单调递增子序列的一个 follow-up 。
解法一 O(n^2):可以改单调递增子序列的 O(n^2) 解法,在每次向前找的时候加上奇偶交错的条件。
代码: https://github.com/lsmgeb89/oj_solution/blob/master/others/ams/ams-0.cc
test : https://github.com/lsmgeb89/oj_solution/blob/master/others/ams/test.txt
很容易实现,这个解法应该是对的。
那有没有 O(nlog(n)) 的解法?去尝试改单调递增子序列的 O(nlog(n)) 的 recurrence 。
想法一:
维护两个 list ,一个总是以偶数为结尾,一个总是以奇数为结尾。
每次 update 的时候交错 update 两个 list 。但是 update 的细节很难理清楚。
最后取两个 list 中最长的一个返回。
代码: https://github.com/lsmgeb89/oj_solution/blob/master/others/ams/ams-1.cc
这个代码过不了那个长度为 1000 的序列的 case ,只差一点,但感觉代码越写越乱,不高兴再查了。正确性存疑。
想法二:
同样维护两个 list 。
第一个 list 的第 0 个 element 是以奇数结尾的子序列,第 1 个 element 是以偶数结尾的子序列,以此类推。
第二个 list 的第 0 个 element 是以偶数结尾的子序列,第 1 个 element 是以奇数结尾的子序列,以此类推。
每次 update 各自的 list 。
最后取两个 list 中最长的一个返回。
代码: https://gist.github.com/lsmgeb89/f686e624855229c90c82de0bc52613b2
感觉正确性不对。因为稍长的 case 就过不了。
例如: 28, 26, 19, 29, 17, 20, 25, 14, 9, 5, 30, 6, 15, 18, 11, 16, 23, 8, 4, 27
主要是想法一的状态转移方程很难想清楚
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.