题目描述 给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
}
}