周末了,实验室的网速还是不给力啊,不知道doctors都在干啥,,,最近都在做算法作业,昨天晚上看了一部电影《将爱进行到底》,刚打开电影没多久就听到了很熟悉的旋律,让我很是惊讶,这竟然就是电视版的那首主旋律,十几年过去了,徐静蕾从初出茅庐到现在成为了老徐,我也从黄毛丫头到现在成为了男子汉,浮生若梦,岁月流沙。将爱电影的主题曲《因为爱情》很好听,王菲的声音空灵虚无缥缈,与陈奕迅共同演绎了一首温馨甜蜜的歌曲。
言归正传,到算法上来了,最长递增子序列问题在这里不再啰嗦了,不懂的自己baidu去,不过我更喜欢google,呵呵。个人的爱好吧。
最长递增子序列有两种解法,一种是借助前面的LCS算法,另外是本文要写的另外一种方法。
1.LCS
LCS算法比较的是任意两个序列的最长公共子序列,在最长递增子序列中,我们将原序列A首先升序排列得到B,然后将A和B求LCS就可以达到目的。在这里不再赘述,有关LCS算法,可以参见前面的文章。
2.网上流传两种版本的最长递增子序列算法,http://hi.baidu.com/newmyl/blog/item/12f15e97ac88b06854fb965d.html连接对这个算法进行了深入的分析。我个人比较赞同http://www.felix021.com/blog/read.php?1587&guid=5的分析(http://blog.csdn.net/fisher_jiang/archive/2008/05/13/2442348.aspx也对这个算法进行了分析但是本人觉得比较晦涩难懂,C++STL我不习惯,高手自己揣摩吧~~~~),摘录如下:
|
个人觉得他的分析十分清晰明了,真正能让我们知道动态规划算法的过程。按照这种思路,我实现了Python版本的LIS算法:
#最长单调递增子序列 def LIS(B, d, n): left = right = mid = len = 1 B[0] = d[0] # //从0开始计数 for i in range(1, n): left = 0 right = len while(left <= right): mid = (left + right) // 2 if(B[mid] < d[i]): left = mid + 1 #二分查找d[i]的插入位置 else: right = mid - 1 B[left] = d[i] #插入 if(left > len) : len = len +1 #更新length return len if '__name__ = __main__' : d = [2 , 1 , 5 , 3 , 6, 4, 8, 9, 7] B=[0]*len(d) #初始化B数组 print(LIS(B, d, len(d)))
输出结果:
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on CHENX, Threaded |