题目
给定一个长度为 N的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000,
−10的9次方≤数列中的数≤10的9次方
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
思路
- 本题的问题关键点在于子序列。以上述为例:最长单调子序列是1 2 5 6
- DP:
- 状态表示:一维序列:f[i]
- 集合:从题目的问法出发去定义:在所有以a[i]结尾的严格单调上升子序列
- 属性:最大值(本题),最小值,数量
- 状态计算:挖掘“最后”,以最后一个不同的点来划分
- 集合的划分:以倒数第二个数是什么分成i类,下图下标从1开始
- 求第K类中的上升子序列=左半部分的max+1;左半部分的max=f(k);
- 最后在所有k类中找到最大值,某一类可能不存在:a[k]>=a[i],只有在a[k]<a[i]的时候才要计算max
- 状态表示:一维序列:f[i]
代码
N=int(input())
L=list(map(int,input().split()))
f=[0 for _ in range(N)]
res=0
for i in range(0,N): # 根据倒数第二个不同的数分了i类
f[i]=1
for k in range(0,i): # 计算左半部分k的最大值,有i-1个数
if L[i]>L[k]: # 合法才要计算
f[i]=max(f[i],f[k]+1)
res =max(res,f[i])
print(res)