
最长上升子序列(动态规划)--算法学习
初始化一个数组 遍历序列中的每一个元素 最终, 读取输入:首先读取序列的长度 初始化数组:创建一个 动态规划计算:对于每个位置 输出结果:最后,
发布日期:2021-05-15 00:27:55
浏览次数:12
分类:精选文章
本文共 846 字,大约阅读时间需要 2 分钟。
为了解决这个问题,我们需要找到给定序列的最长上升子序列的长度。上升子序列是指从原序列中选择一些元素,保持顺序,使得每个元素都比前一个大。
方法思路
我们可以使用动态规划的方法来解决这个问题。对于每一个位置 i
,我们记录以 a[i]
为终点的最长上升子序列的长度。初始化时,每个位置的长度都设为1,因为每个元素本身就是一个长度为1的子序列。
具体步骤如下:
max_len
,其中 max_len[i]
表示以 a[i]
为终点的最长上升子序列的长度。a[i]
,对于每个 i
,检查它前面所有 j
的位置(j < i
),如果 a[j] < a[i]
,则更新 max_len[i]
为 max(max_len[j] + 1)
。max_len
数组的最后一个元素即为最长上升子序列的长度。解决代码
n = int(input())a = list(map(int, input().split()))max_len = [1] * nfor i in range(n): for j in range(i): if a[j] < a[i]: if max_len[j] + 1 > max_len[i]: max_len[i] = max_len[j] + 1print(max_len[-1])
代码解释
n
和序列 a
。max_len
数组,初始值为1,因为每个元素本身都是一个长度为1的子序列。i
,遍历其前面的每个位置 j
,如果 a[j] < a[i]
,则更新 max_len[i]
为 max(max_len[j] + 1)
。max_len
数组的最后一个元素即为最长上升子序列的长度。这种方法的时间复杂度为 O(N^2),在处理长度为 1000 的序列时是可行的。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月30日 01时52分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
云数据库
2019-03-11
大数据在不同领域的应用
2019-03-11
页面置换算法
2019-03-11
推荐系统资料
2019-03-11
文件系统的层次结构
2019-03-11
减少磁盘延迟时间的方法
2019-03-11
vue(渐进式前端框架)
2019-03-11
权值初始化和与损失函数
2019-03-11
案例讨论
2019-03-11
传输层基本功能
2019-03-11
问题的计算复杂度:排序问题
2019-03-11
算法的伪码表示
2019-03-11
递推方程与算法分析
2019-03-11
主定理的应用
2019-03-11
动态规划算法的迭代实现
2019-03-11
最优装载问题
2019-03-11
最大团问题
2019-03-11
圆排列问题
2019-03-11
课程总结
2019-03-11
认识CMake及应用
2019-03-11