• 最大不降子序列


    解法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 }



  • 相关阅读:
    CSS书写规范参考
    CSS实现垂直居中的5种方法
    HTML5新标签
    sublime win10下中文输入框自动跟随解决
    变量更改值
    查看文件
    list copy
    Tomcat JAR包冲突报错
    第一周单元3:Requests库网络爬虫实例-查询ip地址
    .strip()的喵用!
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5835660.html
Copyright © 2020-2023  润新知