参考博客
dp
简单的dp,d[i]记录以i结尾的最长上升子序列的长度。
时间复杂度O(n^2)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 103, INF = 0x7f7f7f7f;
int a[maxn], f[maxn];
int n,ans = -INF;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
f[i] = 1;
}
for(int i=1; i<=n; i++)
for(int j=1; j<i; j++)
if(a[j] < a[i])
f[i] = max(f[i], f[j]+1);
for(int i=1; i<=n; i++)
ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}
贪心,二分
时间复杂度O(nlogn),似乎只能求长度。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int num[10]={3,6,3,2,4,6,7,5,4,3};
const int INF=0x3f3f3f3f;
int l=10, g[100], d[100];
int main()
{
fill(g, g+l, INF);
int max_=-1;
for(int i=0; i<l; i++)
{
int j = lower_bound(g, g+l, num[i]) - g;
d[i] = j+1;
if(max_<d[i])
max_=d[i];
g[j] = num[i];
}
printf("%d\n", max_);
return 0;
}