最长递增子序列

今天看了hdu的1159,以为是最长递增子序列,然后敲完代码发现samp不对,看了discuss发现原来是lcs


最长递增子序列(LIS):求一个序列的LIS

有三种算法,一种是排个序然后和自己求最长公共子序列

第二种就是dp,dp[i] = max(dp[j]) + 1; (j∈[0,i-1]),dp[i]表示前i个的LIS的长度,能用这个状态方程肯定要加个判断条件的,即保证递增

第三种就是

用一个数组B[i],表示长度为i的结尾的最小的值

从第一个开始遇到一个新值,就在B数组里查看是否可以插进去,即是不是可以更新某个长度结尾的最小值,能更新就更新之,不能的话,那就意味着它比B数组的所有值都大

那么就代表LIS的长度又要增加一

因为B数组肯定有序,而查找替换就可以用二分解决了,因此这个算法的时间复杂度为O(nlogn)


参考:O(nlogn)算法

三种简介与实现

你可能感兴趣的:(最长递增子序列)