最长上升子序列(LIS)

来源:互联网 发布:计算机视觉与人工智能 编辑:程序博客网 时间:2024/04/29 01:37
O(n^2)算法:
#include<stdio.h>#include<iostream>using namespace std;#define INF 0x3f3f3f3f#define N 1005int a[N],g[N];int main(){    int n,i,ans=0,L,R,mid;    scanf("%d",&n);    for(i=1;i<=n;i++)    {    scanf("%d",&a[i]);    g[i]=INF; }   for(i=1;i<=n;i++){L=1,R=i-1;while(L<=R){    mid=(L+R)>>1;    if(g[mid]>=a[i])  R=mid-1;    else  L=mid+1;      }      if(g[L]>a[i])      g[L]=a[i];  //printf("%d %d\n",L,g[L]);  ans=max(ans,L);}   //for(i=1;i<=ans;i++)  //printf("%d ",g[i]); printf("%d\n",ans); system("pause");  return 0;}

O(n log n)算法:#include<stdio.h>#include<iostream>using namespace std;#define N 1005int a[N],dp[N];int main(){ int n,i,j,ans=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=1; } for(i=1;i<=n;i++){for(j=1;j<i;j++){ if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1); } ans=max(dp[i],ans);} printf("%d\n",ans); //system("pause"); return 0;}

 

原创粉丝点击