Acwing 895.最长上升子序列

给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数N。

第二行包含N个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1N10001≤N≤1000,
109109−109≤数列中的数≤109

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4


思路:
根据动态转移方程,取每次循环遍历的后最后一个a[i]结尾的单调上升的序列的最大值,最后对每一类的最大值在进行Max
时间复杂度:O(n^2)
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N = 1e5;
 5 int n;
 6 int a[N];
 7 int f[N];
 8 int main(){
 9   scanf("%d",&n);
10   for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
11   for(int i = 1;i <= n;i++){
12     f[i] = 1;
13     for(int j = 1;j < i;j++)
      //动态转移方程
14 if(a[i] > a[j]) f[i] = max(f[i],f[j] + 1); 15 } 16 17 int res = 0; 18 for(int i = 1;i <= n;i++) res = max(res,f[i]); 19 printf("%d",res); 20 } 21

猜你喜欢

转载自www.cnblogs.com/luyuan-chen/p/11601332.html