最长递增子序列!!!(DP ,二分)

本文详细介绍了如何解决最长递增子序列问题,包括动态规划和二分法两种方法,提供了具体代码实现和时间复杂度分析。

最长递增子序列
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 158(64 users)Total Accepted: 68(56 users)Rating: Special Judge: No
Description

给出一个数字序列求其最长的递增子序列例如序列(1,7,3,5,9,4,8).

(1,7)和(3,4,8)是其递增子序列但其最长的递增子序列是(1,3,5,8)。


Input

本题有多组测试数据,对于每组测试数据第一行是一个整数n(n<=100)代表序列长度。

第二行是n个整数。

Output
最长递增子序列长度
Sample Input

7

1 7 3 5 9 4 8

Sample Output
4

对于这个题目,我只能说是水题。但是有点坑!!

我使用了两种方法解决这个题目 :

1.DP

2.二分法


我一开始也不知道还能使用二分法,但是通过后面学习和细心被别人指导,发现这个可以使用二分法的


对于DP的解决是,

dp[i] = MAX(dp[i],dp[j]+1)  前提条件是  arr[i] > arr[j]

代码如下:



后来我花了点时间,在使用二分法解决这个问题 :

二分法的思想就是在插入的时候要使用二分查找,看能插入到哪里,时间复杂度为 o(nlog(n))

时间也很小了 

代码如下 :



由于二分法是我想出来的,所以我没有进行过特别变态的数据,以后我要是能发现比我这个还要好的,我就把他的那个学习一下。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值