简单dp,思路见下面
//这也属于一个二元组问题,可以转换成
//求DAG图中最长路径的问题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int d[1010],G[1010][1010],n,a[1010];
int dp(int i)
{
int& ans=d[i];
if(ans>0) return ans;
ans=1;
for(int j=i;j<=n;j++) //与上一个DAG上的dp有所不同的是 只能往后搜索
if(G[i][j])
ans=ans>dp(j)+1?ans:dp(j)+1;
return ans;
}
int main()
{
int i,j,m;
while(cin>>n)
{
for(i=1;i<=n;i++) //给输入的数字编号,作为图中的顶点
cin>>a[i];
memset(d,0,sizeof(d));
memset(G,0,sizeof(G));
for(i=1;i<=n;i++) //建立图的邻接矩阵
for(j=1;j<=n;j++)
if(a[i]<a[j])
G[i][j]=1; //如果j可以放在i后面形成上升序列,添加一条边
m=0;
for(i=1;i<=n;i++) //求出每个顶点的最长路径,再取其中的最大值
{
int k=dp(i);
if(m<k)
m=k;
}
cout<<m<<endl;
}
}