最长上升子序列(最长递增子序列,LIS)

最长上升子序列(最长递增子序列,LIS)

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

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

思路:设原序列 v [ ] v[] v[],答案序列 a n s [ ] ans[] ans[],当前工作指针为 i i i。初始化 a n s [ 0 ] = v [ 0 ] ans[0]=v[0] ans[0]=v[0],遍历原序列 v [ ] v[] v[]

  • v [ i ] v[i] v[i]> a n s [ a n s . s i z e ( ) − 1 ] ans[ans.size()-1] ans[ans.size()1],则将 v [ i ] v[i] v[i]加入 a n s [ ] ans[] ans[]末尾
  • 否则,用 v [ i ] v[i] v[i]替换 a n s [ ] ans[] ans[]中首个 ≥ v [ i ] \ge v[i] v[i]的元素。由于 a n s [ ] ans[] ans[]始终有序,故可采用二分加速
extern int n;
extern vector<int>v,ans;
void lis(){
    ans.push_back(v[0]);
    for(auto i:v){
        if(i>ans[ans.size()-1]) ans.push_back(i);
        else ans[distance(ans.begin(),lower_bound(ans.begin(),ans.end(),i))]=i;
    }
    cout<<ans.size()<<endl;
}

相关推荐

  1. 上升序列(递增序列,LIS)

    2024-07-14 03:48:01       21 阅读
  2. 上升序列模板(LIS

    2024-07-14 03:48:01       22 阅读
  3. LeetCode 300 递增序列

    2024-07-14 03:48:01       58 阅读
  4. Leetcode 300 递增序列

    2024-07-14 03:48:01       53 阅读
  5. 【LeetCode-300.递增序列

    2024-07-14 03:48:01       37 阅读
  6. LeetCode 300. 递增序列

    2024-07-14 03:48:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 03:48:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 03:48:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 03:48:01       58 阅读
  4. Python语言-面向对象

    2024-07-14 03:48:01       69 阅读

热门阅读

  1. 【docker镜像如何在不同的架构上运行】

    2024-07-14 03:48:01       19 阅读
  2. 第九十五周周报

    2024-07-14 03:48:01       15 阅读
  3. Python input NameError: name ‘xxx‘ is not defined.

    2024-07-14 03:48:01       18 阅读
  4. 【数据结构】二叉树

    2024-07-14 03:48:01       20 阅读
  5. AWS认证SAA-C03每日一题

    2024-07-14 03:48:01       17 阅读
  6. 高项-信息化发展知识要点

    2024-07-14 03:48:01       18 阅读
  7. 什么是开放最短路径优先(OSPF)

    2024-07-14 03:48:01       18 阅读
  8. 【YashanDB知识库】yasql登录报错:YAS-00413

    2024-07-14 03:48:01       20 阅读