最长上升子序列(LIS)

最长上升子序列(LIS)

朴素dp(O( n 2 n^2 n2))

  • 状态表示:
    • 集合dp:所有满足上升条件的元素集
    • 属性:cnt,dpi表示以i结尾的上升子序列长度,init(dp)=1
  • 状态计算:
    • i为当前工作区间尾指针,j为当前工作区间工作指针
    • 不选i:aj>ai,无法满足最优解,不选
    • 选i:aj<ai,满足上升条件,可选
      • dpi的结果转移自dpj,因此转移方程为 d p i = m a x ( d p i , d p j + 1 ) dpi=max(dpi,dpj+1) dpi=max(dpi,dpj+1),当 d p i = d p j + 1 dpi=dpj+1 dpi=dpj+1时,说明ai已选,否则证明aj包含在之前已选的子集中
cpp 复制代码
extern vector<int>v(n),dp(n,1);
int dp(){
	for(int i=0;i<n;i++)
        for(int j=0;j<i;j++)
            if(v[j]<v[i])//选v[i]
                dp[i]=max(dp[i],dp[j]+1);
    return *max_element(dp.begin(),dp.end());
}

LCS求解LIS(O( n 2 n^2 n2))

思路:将序列排序,两序列的LCS即为原序列的LIS

贪心+二分(O( n log ⁡ n n\log n nlogn))

相关推荐
汤愈韬3 分钟前
模型求解算法
人工智能·算法·机器学习
Keven_1122 分钟前
算法札记:DP中的滚动数组
算法·滚动数组
luj_176823 分钟前
随机性在算法与占卜中的共通原理
c语言·开发语言·c++·经验分享·算法
Chen—LSN44 分钟前
C语言——深度理解指针(5)
c语言·数据结构·算法·排序算法
佳児素花痴╮3 小时前
树的基础知识与查找排序算法
数据结构·算法
lueluelue479 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16812 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子12 小时前
Adaboost算法原理与计算实例
算法
别怪我很水13 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法