O(n^2)算法:
#include<iostream>
#include<cstring>
using namespace std;
int dp[10];
int main()
{
int a[10];
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
memset(dp,0,sizeof(dp));
dp[1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+1);
cout<<dp[n]<<endl;
return 0;
}
O(nlogn)算法:
其中g(i)表示d值为i的最小状态编号。
在给定状态i时,可以二分查找得到满足g(k)>=a[i]的第一个下标k,则d[i]=k,此时a[i]<g(k),d(i)=k,所以更新g(k)=a[i].
#include<iostream>
#include<cstring>
using namespace std;
const int inf =1000000;
int dp[10];
int g[10];
int main()
{
int a[10];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
g[i]=inf;
}
memset(dp,0,sizeof(dp));
//dp[1]=1;
for(int i=1;i<=n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i])-g;
dp[i]=k;
g[k]=a[i];
}
cout<<dp[n]<<endl;
return 0;
}