当前位置: 首页 > news >正文

【蓝桥杯】算法笔记3

1. 最长上升子序列(LIS)

1.1. 题目

想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6

你要从中挑出一些数字,这些数字要满足两个条件:

  1. 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序)

  2. 你挑的数字要一个比一个大(严格递增)

问:最多能挑出多少个这样的数字?

比如上面这个例子:

  • 可以挑 3, 8(但长度只有2)

  • 可以挑 1, 2, 5, 6(长度是4)

  • 也可以挑 1, 2, 8(长度是3)

最长的就是4,所以答案是4

1.2. 思路(动态规划)

我们用一个数组dp来记录:

  • dp[i] 表示:以第i个数字结尾时,能组成的最长上升子序列的长度

比如对于序列 [3,1,2,1,8,5,6]:

  1. 第一个数字3:只能选它自己,所以dp[0]=1

  2. 第二个数字1:比3小,不能接在3后面,只能自己开头,dp[1]=1

  3. 第三个数字2:

    • 可以接在1后面(1<2),所以长度=dp[1]+1=2

    • 不能接在3后面(3>2)

    • 所以dp[2]=2

  4. 第四个数字1:

    • 比前面的3,1,2都小,只能自己开头

    • dp[3]=1

  5. 第五个数字8:

    • 可以接在3后面(3<8),长度=dp[0]+1=2

    • 可以接在1后面(1<8),长度=dp[1]+1=2

    • 可以接在2后面(2<8),长度=dp[2]+1=3

    • 可以接在前面的1后面(1<8),长度=dp[3]+1=2

    • 最大的是3,所以dp[4]=3

  6. 继续计算最后两个数字...最终dp = [1,1,2,1,3,3,4]

  7. 最大值是4,所以答案是4

1.3. 完整代码(动态规划)

n = int(input())  # 先读取数字的个数
nums = list(map(int, input().split()))  # 读取数字序列

# 初始化dp数组,每个数字自己就是一个长度为1的子序列
dp = [1] * n  

# 从第二个数字开始检查(因为第一个数字的dp值肯定是1)
for i in range(1, n):
    # 看看前面所有数字
    for j in range(i):
        # 如果前面的数字比当前数字小,就可以接在后面
        if nums[j] < nums[i]:
            # 更新dp[i],选择更大的值
            dp[i] = max(dp[i], dp[j] + 1)
            # 相当于说:
http://www.dtcms.com/a/111269.html

相关文章:

  • 函数栈帧的创建与销毁
  • 言语理解与表达
  • 实战交易策略 篇十四:江南神鹰捕捉热点和熊市生存交易策略
  • 专为 零基础初学者 设计的最简前端学习路线,聚焦核心内容,避免过度扩展,帮你快速入门并建立信心!
  • 第15周:注意力汇聚:Nadaraya-Watson 核回归
  • 生成 SSH Key 并配置 GitHub/GitLab 详细教程
  • 深入理解AOP:面向切面编程的核心概念与实战应用
  • ctfshow VIP题目限免 robots后台泄露
  • 规则引擎Drools
  • 【KMP】P10915 [蓝桥杯 2024 国 B] 最长回文前后缀|普及+
  • RHCSA Linux 系统 文件的查看、复制、移动、重命名
  • 阿里巴巴langengine二次开发大模型平台
  • 压测工具开发实战篇(二)——构建侧边栏以及设置图标字体
  • Linux(十二)信号
  • SQL注入重新学习
  • OpenEuler/CentOS一键部署OpenGauss数据库教程(脚本+视频)
  • openmv用了4个了,烧了2个,质量堪忧啊
  • 基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试
  • 鸿蒙 ——选择相册图片保存到应用
  • 第11/100节:三点估算
  • Muduo网络库实现 [十五] - HttpContext模块
  • 传统开发者视角:智能合约与区块链数据库探秘
  • 实操(进程状态,R/S/D/T/t/X/Z)Linux
  • im即时通讯支持红包收发分销功能,带内嵌web页面,已经测试完美运行
  • 二级索引详解
  • 从基础算力协作到超智融合,超算互联网助力大语言模型研习
  • C++学习笔记之 模板|函数模板|类模板
  • 嵌入式学习笔记——ARM-中断与异常
  • R5周:天气预测
  • linux 进程/线程设置核亲和性