POJ 2533 Longest Ordered Subsequence

题目描述:LIS(Longest Increasing Subsequence)模板题

 

分析:O(n^2)的方法

        状态表示:d[i]表示以i结尾的最长上升子序列长度

        转移方程:d[i]=max{ 1,d(j)+1 } ( j=1,2,3,...,i-1且A[j]<A[i] )

                       即A[j]<A[i],d[i]=d[j]+1

                          A[j]>=A[i],d[i]=1

 1 #include<cstdio>
 2 int main()
 3 {
 4     int N,a[10005],d[10005];
 5     scanf("%d",&N);
 6     for(int i=0;i<N;i++)
 7     scanf("%d",&a[i]);
 8     int max=0;
 9     for(int i=0;i<N;i++)
10     {
11         d[i]=1;
12         for(int j=0;j<i;j++)
13         {
14             if(a[j]<a[i]&&d[j]+1>d[i])
15             d[i]=d[j]+1;
16         }
17         if(d[i]>max)  max=d[i];
18     }
19     printf("%d\n",max);
20     return 0;
21 }

          O(nlogn)的方法:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int INF=1000000000;
 5 int N,a[10005],d[10005],g[10005];
 6 int main()
 7 {
 8     scanf("%d",&N);
 9     for(int i=0;i<N;i++)
10     scanf("%d",&a[i]);
11     for(int i=1;i<=N;i++) g[i]=INF;
12     int ans=0;
13     for(int i=0;i<N;i++)
14     {
15         int k=lower_bound(g+1,g+1+N,a[i])-g;
16         d[i]=k;
17         g[k]=a[i];
18         ans=max(ans,d[i]);
19     }
20     printf("%d\n",ans);
21     return 0;
22 }

 

        

posted @ 2014-04-06 11:23  DF的翱翔  阅读(294)  评论(0编辑  收藏  举报