• nyoj 214-单调递增子序列(二) (演算法,PS:普通的动态规划要超时)


    214-单调递增子序列(二)


    内存限制:64MB 时间限制:1000ms Special Judge: No
    accepted:11 submit:35

    题目描述:

    给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

    如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

    输入描述:

    有多组测试数据(<=7)
    每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
    数据以EOF结束 。
    输入数据保证合法(全为int型整数)!

    输出描述:

    对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。

    样例输入:

    7
    1 9 10 5 11 2 13
    2
    2 -1

    样例输出:

    5
    1

    分析:
      1、如果给的串本身是升序的,就直接加入进来temp[]串中
      2、否则的话我们要找到第一个大于等于该值的位置,并改变该位置的值(使最终组成的temp[]串ASCⅡ码之和最小)

    核心代码:

     1 while(m --)
     2 {
     3     scanf("%d", &v);
     4     if(temp[cnt] < v)
     5     {
     6         temp[++cnt] = v;
     7         continue;
     8     }
     9     for(int i = 0; i <= cnt; ++ i)
    10     {
    11         if(temp[i] >= v)
    12         {
    13             temp[i] = v;
    14             break;
    15         }
    16     }
    17 }

    C/C++代码实现(AC):

     
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <stack>
     7 #include <map>
     8 #include <queue>
     9 #include <set>
    10 
    11 using namespace std;
    12 const int MAXN = 100010;
    13 
    14 int main()
    15 {
    16 
    17     int t, A[MAXN], temp[MAXN], cnt;
    18     while(~scanf("%d", &t))
    19     {
    20         cnt = 0;
    21         memset(A, 0, sizeof(A));
    22         memset(temp, 0, sizeof(temp));
    23         scanf("%d", &A[0]);
    24         temp[cnt] = A[0];
    25         for(int i = 1; i < t; ++ i)
    26         {
    27             scanf("%d", &A[i]);
    28             if(temp[cnt] < A[i])
    29             {
    30                 temp[++cnt] = A[i];
    31                 continue;
    32             }
    33             for(int j = 0; j <= cnt; ++ j)
    34                 if(A[i] <= temp[j])
    35                 {
    36                     temp[j] = A[i];
    37                     break;
    38                 }
    39 
    40         }
    41         printf("%d
    ", cnt + 1);
    42     }
    43     return 0;
    44 }
    
    
    

    C/C++代码(TLE)<动态规划>:

    
    
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <cmath>
     6 #include <stack>
     7 #include <map>
     8 #include <queue>
     9 #include <set>
    10 
    11 using namespace std;
    12 const int MAXN = 100010;
    13 
    14 int main()
    15 {
    16 
    17     int t, A[MAXN], dp[MAXN], cnt;
    18     while(~scanf("%d", &t))
    19     {
    20         cnt = 0;
    21         memset(A, 0, sizeof(A));
    22         memset(dp, 0, sizeof(dp));
    23         for(int i = 0; i < t; ++ i)
    24         {
    25             scanf("%d", &A[i]);
    26             dp[i] = 1;
    27             for(int j = 0; j < i; ++ j)
    28                 if(A[i] > A[j])
    29                     dp[i] = max(dp[i], dp[j] + 1);
    30             cnt = max(cnt, dp[i]);
    31         }
    32         printf("%d
    ", cnt);
    33     }
    34     return 0;
    35 }
    
    
    
     
  • 相关阅读:
    使用CNN和Python实施的肺炎检测
    使用OpenCV和Tensorflow跟踪排球的轨迹
    使用PyMongo查询MongoDB数据库!
    Pandas的crosstab函数
    日记9----web专用
    日记8----windows操作系统专用
    日记7----Java专用
    句柄类
    代理类
    C++ 计算机程序设计(西安交大mooc)
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9102649.html
Copyright © 2020-2023  润新知