最长上升子序列(LIS)

最长上升子序列(LIS)

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

  • 状态表示:
    • 集合dp:所有满足上升条件的元素集
    • 属性:cnt,dp[i]表示以i结尾的上升子序列长度,init(dp)=1
  • 状态计算:
    • i为当前工作区间尾指针,j为当前工作区间工作指针
    • 不选i:a[j]>a[i],无法满足最优解,不选
    • 选i:a[j]<a[i],满足上升条件,可选
      • dp[i]的结果转移自dp[j],因此转移方程为 d p [ i ] = m a x ( d p [ i ] , d p [ j ] + 1 ) dp[i]=max(dp[i],dp[j]+1) dp[i]=max(dp[i],dp[j]+1),当 d p [ i ] = d p [ j ] + 1 dp[i]=dp[j]+1 dp[i]=dp[j]+1时,说明a[i]已选,否则证明a[j]包含在之前已选的子集中
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))

相关推荐
KyollBM2 小时前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
Univin4 小时前
C++(10.5)
开发语言·c++·算法
Asmalin4 小时前
【代码随想录day 35】 力扣 01背包问题 一维
算法·leetcode·职场和发展
剪一朵云爱着4 小时前
力扣2779. 数组的最大美丽值
算法·leetcode·排序算法
qq_428639614 小时前
虚幻基础:组件间的联动方式
c++·算法·虚幻
深瞳智检4 小时前
YOLO算法原理详解系列 第002期-YOLOv2 算法原理详解
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
怎么没有名字注册了啊5 小时前
C++后台进程
java·c++·算法
Rubisco..5 小时前
codeforces 2.0
算法
未知陨落5 小时前
LeetCode:98.颜色分类
算法·leetcode
~kiss~6 小时前
K-means损失函数-收敛证明
算法·机器学习·kmeans