给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N 。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤1000 ,
−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
#include <iostream>
#include <algorithm>
using namespace std;
int n;
const int N=11000;
//读入数据,状态数组
int a[N],f[N];
int main(void)
{
//读入数据
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
//遍历所有元素,求出所有以a[i]结尾的子序列的最大长度,最后在找出不同结尾的最大值即可
for(int i=1;i<=n;i++)
{
//至少子序列长度不小于1,可能本身构成一个子序列.
f[i]=1;
//为什么要有这个循环,主要是因为当前结尾元素为f[i],那么它前面可能有
//i-1个元素符合条件,需要进行判断.
for(int j=1;j<i;j++)
{
if(a[j]<a[i])//判断,如果当前的a[i]>a[j]说明a[j]是符合条件的
f[i]=max(f[i],f[j]+1);
}
}
int u=0;
//找出最大值
for(int i=1;i<=n;i++)
u=max(u,f[i]);
cout<<u;
return 0;
}
菜鸡的自我理解,如果不对,还请指出来qaq