zoukankan      html  css  js  c++  java
  • 最大不降子序列

    解法1(二分法:o(n*log2(n))):

     1 #include <stdio.h>
     2 #include <iostream>
     3 #define MAXN 10000
     4 using namespace std;
     5 
     6 int a[MAXN], low[MAXN];
     7 
     8 int main(void)
     9 {
    10     int n;
    11     while(cin >> n)
    12     {
    13         low[1]=a[1];
    14         int now=1;
    15         for(int i=1; i<=n; i++)
    16         cin >> a[i];
    17         for(int i=2; i<=n; i++)
    18         {
    19             if(a[i]>low[now])  low[++now]=a[i];
    20             else
    21             {
    22                 int pos=lower_bound(low, low+now, a[i]) - low;
    23                 low[pos]=a[i];
    24             }
    25         }
    26         cout << now << endl;
    27     }
    28     return 0;
    29 }

    解法2(二分法队列实现:o(n*long2(n))):

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #define MAXN 1000000
     5 using namespace std;
     6 
     7 int main(void)
     8 {
     9     int n;
    10     while(cin >> n)
    11     {
    12         int stack[MAXN];
    13         int top=0;
    14         stack[0]=-1;
    15         for(int i=1; i<=n; i++)
    16         {
    17             int temp;
    18             cin >> temp;
    19             if(temp>stack[top])  stack[++top]=temp;
    20             else
    21             {
    22                 int pos=lower_bound(stack, stack+top, temp)-stack;
    23                 stack[pos]=temp;
    24             }
    25         }
    26         cout << top << endl;
    27     }
    28     return 0;
    29 }

    解法3(o(n*n)):

     1 #include <stdio.h>
     2 #include <iostream>
     3 #define MAXN 10000+10
     4 using namespace std;
     5 
     6 int main(void)
     7 {
     8     int n;
     9     while(cin >> n)
    10     {
    11         int a[MAXN], alen[MAXN], maxlen=1;
    12         for(int i=1; i<=n; i++)
    13         alen[i]=1;
    14         for(int i=1; i<=n; i++)
    15         cin >> a[i];
    16         for(int i=2; i<=n; i++)
    17         {
    18             int max=0;
    19             for(int j=1; j<=i-1; j++)
    20             if(a[j]<a[i] && max<alen[j])    max=alen[j];
    21             alen[i]=max+1;
    22             if(alen[i]>maxlen)   maxlen=alen[i];
    23         }
    24         cout << maxlen << endl;
    25     }
    26     return 0;
    27 }

    方法4(dp(o(n*n))):

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <iostream>
     5 #define MAXN 100
     6 using namespace std;
     7 
     8 int main(void)
     9 {
    10     int n;
    11     while(cin >> n)
    12     {
    13         int a[MAXN], low[MAXN];
    14         memset(low, 0, sizeof(low));
    15         for(int i=0; i<n; i++)
    16         cin >> a[i];
    17         for(int i=0; i<n; i++)
    18         {
    19             for(int j=i+1; j<n; j++)
    20             {
    21                 if(a[j]>a[i])
    22                 low[j]++;
    23             }
    24 
    25         }
    26         sort(low, low+n);
    27         cout << low[n-1];
    28     }
    29     return 0;
    30 }



  • 相关阅读:
    python基础之函数(基础七)
    python基础之文件操作(基础六)
    python基础之数据类型补充(基础五)
    python之深浅拷贝(基础四)
    python基础数据类型之字典(基础三)
    python基础数据类型之列表,元组(基础二)
    python基础入门二
    随笔
    oss 上传照片失败
    mysql 同表查询更新
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5835660.html
Copyright © 2011-2022 走看看