给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
Input第1行:1个数N,N为序列的长度(2 <= N <= 50000) 
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S ii <= 10^9)Output输出最长递增子序列的长度。Sample Input
8
5
1
6
8
2
4
5
10
Sample Output

5

#include <stdio.h>
#include <iostream>
using namespace std;
int main( )
{
	int a[50005]  , res[50005];
	int n , max = -99999 , tail = 0;
	cin >> n;
	for(int i = 0 ; i < n ; i++)
	{
		scanf("%d" , &a[i]);
	}
	for(int i = 0 ; i < n ; i++)
	{
		if(a[i] > max)
		{
			res[tail++] = a[i];
			max =res[tail - 1];
		}
		else
		{
			for(int j = 0 ; j < tail ; j++)
			{
				if(a[i] <= res[j])
				{
					res[j] = a[i];
					break;
				}
			}
			max = res[tail-1];
		}
		
	}
	printf("%d\n", tail);
	return 0;
}
//5 1 6 8 2 4 5 10
//1.开一个res[]数组存取满足要求的数字 用max 标记数组中最大的数,
//遍历该数 , 如果小于 res[] 则互换 , 保证max 为res[]中末尾最大的数 

2.将该数组升排序 ,再与原数组lcs;

(超时)

#include <stdio.h>
#include <iostream>
using namespace std;
#include <algorithm>
int dp[5000][5000];
int main()
{
	int n , a[5005] , b[5005];
	scanf("%d" , &n);
	for(int i = 1 ; i <= n ; i++)
	{
		scanf("%d" , &a[i]);
		b[i] = a[i];
	}
	sort(a+1 , a+n+1);
//	for(int i = 0 ; i < n ; i++)
//	{
//		printf("a[i] = %d  " , a[i]);
//		printf("b[i] = %d  " , b[i]);
//	}
	for(int i = 1 ; i <= n ; i++)
	{
		for(int j = 1 ; j <= n ; j++)
		{
			if(b[i] == a[j])
			{
				dp[i][j] = dp[i-1][j-1] + 1;
			}
			else
			{
				dp[i][j] = max(dp[i-1][j] , dp[i][j-1]);
			}
		}
	}
//	for(int i = 1 ; i <= n ; i++)
//	{
//		for(int j = 1 ; j <= n ; j++)
//		{
//			printf("%d " , dp[i][j]);
//		}
//		printf("\n");
//	}
	printf("%d\n" ,dp[n][n]);
	return 0;
}