Longest Ordered Subsequence POJ - 2533 最长上升子序列的两种做法

题目描述 给N个数 求最长上升子序列

第一种做法 朴素做法 复杂度O(N^2)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#pragma warning(disable:4996)

using namespace std;
typedef long long ll;
#define MAX 10005
int N;
int a[MAX];
int maxlength[MAX];
int main()
{
	while (scanf("%d", &N) != EOF)
	{
		int leng = 0;
		for (int i = 1; i <= N; i++)
		{
			scanf("%d",&a[i]);
			maxlength[i] = 1;
		}
		for (int i = 2; i <= N; i++)
		{
			for (int j = 1; j < i; j++)
			{
				if (a[i] > a[j])
					maxlength[i] = max(maxlength[i], maxlength[j] + 1);
			}
		}
		printf("%d\n",*max_element(maxlength+1,maxlength+N+1));
	}
	
}

第二种做法 dp加二分

特别好的算法介绍博客:https://blog.csdn.net/yopilipala/article/details/60468359

code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#pragma warning(disable:4996)

using namespace std;
typedef long long ll;
#define MAX 10005
int N;
int a[MAX];
int maxlength[MAX];
int b[MAX];
int main()
{
	while (scanf("%d", &N) != EOF)
	{
		int leng = 0;
		for (int i = 0; i < N; i++)
		{
			scanf("%d", &a[i]);
		}
		memset(b, 0, sizeof(b));
		b[0] = a[0];
		int len = 0;
		for (int i = 1; i < N; i++)
		{
			if (a[i] > b[len])
			{
				b[++len] = a[i];
			}
			else
			{
				int pos = lower_bound(b, b + len, a[i]) - b;
				b[pos] = a[i];
			}
		}
		printf("%d\n",len+1);//因为len是从0开始的所以要加上1
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_17175221/article/details/81487322