码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 最长不下降子序列


    上升子序列:元素各不相同

    不下降子序列:元素可以相同

    即   将上升子序列改一个if条件里面的即可

    1. //最长不下降子序列
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. const int N = 100010;
    8. int a[N],f[N];
    9. int n;
    10. int main()
    11. {
    12. int ans = 1;
    13. cin>>n;
    14. for(int i = 1;i <= n;i++)
    15. {
    16. f[i] = 1;
    17. }
    18. for(int i = 2;i <= n;i++)
    19. {
    20. for(int j = 1;j <= i;j++)
    21. if(a[i] >= a[j])f[i] = max(f[i],f[j]+1);
    22. ans = max(ans,f[i]);
    23. }
    24. cout<
    25. return 0;
    26. }

    若用二分查找就要改两处

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 2020;
    6. int a[N],f[N];//f[]记录上升子序列
    7. int len;//上升子序列的长度
    8. int find(int x)//二分查找第一个大于x的位置
    9. {
    10. int l = 1,r = len,mid;
    11. while(l <= r)
    12. {
    13. mid = (l+r)>>1;
    14. if(x >= f[mid]) l = mid+1;
    15. else r = mid-1;
    16. }
    17. return l;
    18. }
    19. //也不是不可以用lower_bound( )
    20. int main()
    21. {
    22. cin>>n;
    23. len = 1;
    24. for(int i = 1;i <= n;i++)cin>>a[i];
    25. f[1] = a[1];//把第一个元素添加进f[ ]中
    26. //考虑新加进来的a[i]
    27. for(int i = 2;i <= n;i++)
    28. {
    29. //大于则添加
    30. if(a[i] >= f[len])f[++len] = a[i];
    31. else//小于等于则替换
    32. {
    33. int j = find(a[i]);
    34. f[j] = a[i];
    35. }
    36. }
    37. cout<
    38. return 0;
    39. }

    若我们要输出不下降子序列里的最长上升子序列怎么办呢?

    那我们这时候就需要用一个pre[ ]数组来记录原数组a[ ] 的下标(ps:这里是前一个元素下标)

    二分查找的优点:求解长度快

    缺点:不能输出子序列!!!

    所以这里我们需要用第一种方法即可

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 1020;
    6. int a[N],f[N],pre[N];
    7. int longlen;
    8. int n;
    9. void print(int i)
    10. {
    11. if(pre[i]) print(pre[i]);
    12. printf("%d ",a[i]);
    13. }
    14. int main()
    15. {
    16. int ans = 1;
    17. scanf("%d",&n);
    18. for(int i = 1;i <= n;i++)f[i] = 1;
    19. for(int i = 2;i <= n;i++)
    20. {
    21. for(int j = 1;j < i;j++)
    22. if(a[i] > a[j] && f[i] < f[j] + 1)
    23. {
    24. f[i] = f[j] + 1;
    25. pre[i] = j;//记录前驱
    26. }
    27. if(f[i] > ans)
    28. {
    29. ans = f[i];
    30. longlen = i;
    31. }
    32. }
    33. printf("%d\n",ans);
    34. print(longlen);
    35. return 0;
    36. }

  • 相关阅读:
    春节静态HTML网页作业模板 传统节日文化网站设计作品 静态学生网页设计作业简单网页制作
    gcc中-I(大写的i)参数的作用
    Mathorcup数学建模竞赛第四届-【妈妈杯】B题:推荐书籍(附解析思路和MATLAB代码)
    【Linux】权限管理-权限的概念,umask,粘滞位
    支持录音的笔记APP,可将录音转化为文字的笔记软件
    pinyin-match选择器拼音快速检索目标
    力扣-459.重复的子字符串
    汉字风格迁移篇--SAFont:使用自我注意机制的自动字体合成
    代码随想录训练营补充|图论|Golang
    概率图模型:HMM(隐马),MEMM(最大熵),CRF(条件随机场)
  • 原文地址:https://blog.csdn.net/Demilly123/article/details/127796574
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号