例题51Nod-1376,一个经典问题,给出一个序列问该序列的LIS以及LIS的数量. 这里我学习了两种解法,思路和代码都是参考这两位大佬的: https://www.cnblogs.com/reverymoon/p/9496040.html https://www.cnblogs.com/RabbitHu/archive/2017/11/02/51nod1376.html 首先是先分析一下问题,求LIS是一个很基础的问题了,用得最多的是nlogn的解法这里就不讲了.当我们求出序列a[i]的LI…
最长上升子序列(LIS)的典型变形,熟悉的n^2的动归会超时.LIS问题可以优化为nlogn的算法.定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素.注意d中元素是单调递增的,下面要用到这个性质.首先len = 1,d[1] = a[1],然后对a[i]:若a[i]>d[len],那么len++,d[len] = a[i];否则,我们要从d[1]到d[len-1]中找到一个j,满足d[j-1]<a[i]<d[j],则根据D的定义,我们需…
l例如:对于[3,1,4,2,5],最长上升子序列的长度是3 arr = [3,1,4,5,9,2,6,5,0] def lis(arr): #dp[i]表示第i个位置的值为尾的数组的最长递增子序列的长度 #初始化数组,假定数组中每个值的最长子序列就是它自己,即都是1 dp = [1 for _ in range(len(arr))] #遍历数组 for i in range(len(arr)): #当遍历到第i个位置时,再依次从0开始遍历到 for j in range(i): #如果第i个位…
    A HDU 1025 Constructing Roads In JGShining's Kingdom     B POJ 3903 Stock Exchange     C OpenJ_Bailian 1065 Wooden Sticks     D OpenJ_Bailian 1631 Bridging signals     E OpenJ_Bailian 1952 BUY LOW, BUY LOWER     F OpenJ_Bailian 2533 Longest Order…
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外的数组 LIS 来记录 长度从1 到 n 慢慢变长求解的过程中 对应长度的 最长递增子序列的最小的末尾元素 解决方法 长度为1时 {3}: 将3放入LIS中,表示长度为1的时候,{3}数组的最长递增子序列的最小微元素 LIS:{3} 只有一个元素,所以 最长递增子序列就是 {3},最长递增子序列的最…
最长递增(上升)子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增(上升)子序列. 考虑两个数a[x]和a[y],x>y且a[x]<a[y],且dp[x]=dp[y],当a[t]要选择时,到底取哪一个构成最优的呢?显然选取a[x]更有潜力,因为可能存在a[x]<a[z]<a[y],这样a[t]可以获得更优的值.在这里给我们一个启示,当dp[x]一样时,尽量选择更小的a[x]. 按dp…
题意:有一些穷国和一些富国分别排在两条直线上,每个穷国和一个富国之间可以建道路,但是路不能交叉,给出每个穷国和富国的联系,求最多能建多少条路 我一开始在想有点像二分图匹配orz,很快就发现,当我把穷国按顺序排了之后,富国写在它旁边,能够连接的富国就成了一个上升子序列,那么问题来了!上升子序列最长有多长? 想到了这个之后,代码就码起来吧,最开始我的做法是最土的那种,用 dp[i] 表示以 i 结尾的最长上升子序列的长度,每次对于一个 i 遍历 i 前面的所有数 j ,取小于 i 的所有 j 的最大…
要邀请n个人参加party,每个人有力量值strength Si和魅力值 beauty Bi,如果存在两人S i ≤ S j and B i ≥ B j 或者  S i ≥ S j and B i ≤ B j 他们两个会产生冲突,问在不产生冲突的条件下,最多能邀请到几个人? [LIS]一开始将所有人按照Si升序排序,Si相同的按照Bi值降序排列,在这个基础上答案就是Bi的最长上升子序列的长度. 为什么Si相同时按照Bi值降序排列? 由求出的子序列时严格递增序列,如果对于相同的Si,Bi是递增,那…
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长.输出这个最长的长度.(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是<符号定义上的问题,并不影响问题的实质)例如有一个序列:1  7  3  5  9  4  8,它的最长上升子序列就是 1 3 4 8…
题面 Description 给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序列的长度 Sample Input 7 1 7 3 5 9 4 8 Sample Output 4 题解 分析LIS的两种做法 第一种: 最朴素的DP方法,时间复杂度为O(n^2) 状态:f[i]表示以ai结尾的最长LIS的长度 转移:f[i]=max{f[k]+1}(…