最长上升子序列(LIS) 两种复杂度算法

来源:互联网 发布:坐月子的书籍推荐知乎 编辑:程序博客网 时间:2024/05/17 02:52


//O(n^2)#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 30010;int dp[maxn], a[maxn];int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;++i)              scanf("%d",&a[i]);          int ans=0;          for(int i=0;i<n;++i)          {              dp[i]=1;              for(int j=0;j<i;++j)              {                  if(a[j]<a[i])                      dp[i] = max(dp[i], dp[j]+1);              }               ans=max(dp[i],ans);          }          printf("%d\n",ans);  }return 0;} //O(nlogn)#include <cstdio>  #include <algorithm>  #define INF 0x3f3f3f  using namespace std;  int dp[30010],a[30010];  int main()  {      int n,i,j;      while(scanf("%d",&n)!=EOF)      {          for(i=0;i<n;++i)          {              scanf("%d",&a[i]);              dp[i]=INF;          }          for(i=0;i<n;++i)              *lower_bound(dp,dp+n,a[i])=a[i];          printf("%d\n",lower_bound(dp,dp+n,INF)-dp);       }      return 0;  }    




原创粉丝点击