二部图问题
现在有一串数据,找出最大递增序列!
比如:4 2 6 3 1 5 最大递增序列为2 3 5 输出3就行了
大家来讨论一下,怎么解决一下这个问题!
[解决办法]
二部图是什么?二分图?
这个问题就是一个最大递增序列问题,最普通的想法就是用DP,n^2肯定可以(类似于LCS问题)。当然还可以优化到n*log(n),那是另一回事儿了。
[解决办法]
动规的经典例题?
[解决办法]
代码网上一大堆,说说思路吧,以4 2 6 3 1 5为例
逐个读入数字,
4 | 此时可能的队列长度为1,最大值为4
4 2 | 由于2 < 4,此时队列长度为1,最大值为2
4 2 6 | 6 > 2,队列有2个,一个长度为1,最大为2,一个长度为2,最大为6
4 2 6 3 | 3 < 6, 3 > 2,队列有2个,一个长度为1,最大为2,一个长度为2,最大为3
4 2 6 3 1 | 1 < 2, 1 < 3,队列有2个,一个长度为1,最大为1,一个长度为2,最大为3
4 2 6 3 1 5 | 5 > 1,5 > 3,队列有3个,一个长度为1,最大为1,一个长度为2,最大为3,一个长度为3,最大为5(分别是1 | 2,3 | 2,3,5)
走到头了,所以输出3,此时是一个最坏情况下n^2的算法,但如果每读入一个新的数时,不是逐个比较,而是利用二分法,查到小于该数的最长序列,那么就是n*log(n)的方法了。
[解决办法]
还是贴一段简单的代码吧,给自己留个备份,临时写的,希望没有错,C#的。
using System;namespace csdnTest{ class Program { static void Main(string[] args) { int[] items = new int[] { 4, 2, 6, 3, 1, 2, 5 }; //用来记录序列长队最大值的数组,index + 1就是序列的长度 int[] maxValues = new int[items.Length]; int maxLength = 1; maxValues[0] = items[0]; for (int i = 1; i < items.Length; i++) { //二分查找对应的最长序列 int lengthIndex = Array.BinarySearch<int>(maxValues, 0, maxLength, items[i]); //针对于.Net里面的BinarySearch的特殊处理,不用理会 if (lengthIndex < 0) lengthIndex = -lengthIndex - 1; if (lengthIndex + 1 > maxLength) maxLength = lengthIndex + 1; maxValues[lengthIndex] = items[i]; } Console.WriteLine(maxLength); } }}