pku 1631 Bridging signals

本文介绍了一种求解最长递增子序列的问题,并通过优化算法将时间复杂度从O(n^2)降低到了O(nlogn)。文章详细解释了如何使用二分查找来提高效率,并附上了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没更新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)

讲到这里,思路应该很清晰了,下面就贴一下我的代码:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值