最长上升子序列(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))

相关推荐
姓蔡小朋友几秒前
算法-双指针
算法
D_FW1 分钟前
数据结构第三章:栈、队列与数组
数据结构·算法
Tisfy8 分钟前
LeetCode 1339.分裂二叉树的最大乘积:深度优先搜索(一次DFS+存数组并遍历)
算法·leetcode·深度优先·题解
csdn_aspnet14 分钟前
MATLAB 高效算法实战:数据分析与算法优化的效率秘诀
算法·matlab·数据分析
budingxiaomoli14 分钟前
优选算法--链表
数据结构·算法·链表
漫随流水22 分钟前
leetcode算法(637.二叉树的层平均值)
数据结构·算法·leetcode·二叉树
漫随流水32 分钟前
leetcode算法(102.二叉树的层序遍历)
数据结构·算法·leetcode·二叉树
源代码•宸34 分钟前
Leetcode—1339. 分裂二叉树的最大乘积【中等】
开发语言·后端·算法·leetcode·golang·dfs
leoufung37 分钟前
LeetCode动态规划经典题:Unique Paths 网格路径计数详解
算法·leetcode·动态规划
李泽辉_39 分钟前
深度学习算法学习(四):深度学习-最简单实现一个自行构造的找规律(机器学习)任务
深度学习·学习·算法