最长上升子序列
#####
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int n;
int a[N],f[N],res;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
f[i]=1;
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++) res=max(f[i],res);
cout<<res;
return 0;
}
####
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1010;
int n;
int f[N],a[N],g[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
f[i]=1;
g[i]=0;
for(int j=1;j<i;j++)
{
if(a[j]<a[i])
{
if(f[i]<f[j]+1)
{
f[i]=f[j]+1;
g[i]=j;
}
}
}
}
int k=1;
for(int i=1;i<=n;i++)
if(f[k]<f[i])
k=i;
cout<<f[k]<<endl;
vector<int> A;
for(int i=0,len=f[k];i<len;i++)
{
A.push_back(a[k]);
k=g[k];
}
reverse(A.begin(),A.end());
for(int i=0;i<A.size();i++)
cout<<A[i]<<" ";
return 0;
}
#####