好久没更新blog了,今天抽点时间,写一个水题的blog。
题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1631
题目大意就是求:从一边的一个地点架桥到另一边的一个地点,当然桥之间是不能相交的。简化题意就是:求一个序列的最长递增序列的长度。
开始毫不犹豫就写了个时间复杂的为O(n^2)的代码,但是(p < 40000)就宣判了tle,所以要改写成复杂度为O(nlogn)的就AC了。
下面讲讲解题过程:
O(n^2)的算法中:创建一个一维数组a[j],dp[],a[j]表示序列的元素,dp[i]表示当前递增序列长度为i的序列末尾元素的最小值,再设一个变量max并初始化为1,表示当前最长递增序列的长度,遍历前面的每个元素j,一直到在dp[]序列找到一个两个值是的dp[k]<a[i]<=dp[k+1],那么dp[k+1]=a[i],在这里,遍历前面的每个元素j,寻找此前最大的子序列时间复杂度为O(n),如果我们在一个有序的序列中查找此前最大的序列长度,我们就可以用二分查找,时间复杂度就会降为O(logn),总的时间复杂度就会为O(nlogn)。
讲到这里,思路应该很清晰了,下面就贴一下我的代码: