B3637 最长上升子序列 題解
ShanCreeperPro · · 题解
B3637 最长上升子序列 題解
管理员注:
阅读本文章前,请先阅读
如需系统学习相关知识点请报名【洛谷-基础算法计划】
点赞上文章即代表您已阅读并熟知其内容。
给定一个正整数序列,输出这个序列中最长上升子序列的长度。
这道题怎么用 dp 长度呢?
如果一个上升子序列的最大值小于一个在它后面的数,那么这个数和这个子序列可以拼成一个更长的上升子序列。
例如一组数据:1,2,4,1,3,4。
我们知道,1,2,3 为一个上升子序列,但是 3 后面的 4 和这个上升子序列拼接后可以组成一个更长的上升子序列。
所以,我们可以设计
再以上面的数据为例子,就可以列出表格:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | 2 | 4 | 1 | 3 | 4 | |
| 1 | 2 | 3 | 1 | 3 | 4 |
代码实现:
-
读入数据;
-
大循环开始,从
1 到n ,计算f_i ,记得初始值是1 ; -
小循环,从
1 到i-1 ,如果a_j 小于a_i 的话,说明这个数可以和f_i 组成上升子序列,则f_i 取\max (f_i,f_j+1) ; -
寻找最大值;