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

Posted GetcharZp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", 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\n", cnt);
33     }
34     return 0;
35 }

 

 

以上是关于nyoj 214-单调递增子序列 (演算法,PS:普通的动态规划要超时)的主要内容,如果未能解决你的问题,请参考以下文章

nyoj 214 单调递增子序列 另类dp

nyoj 单调递增子序列

nyoj 单调递增最长子序列

NYOJ 17 单调递增最长子序列

nyoj 题目17 单调递增最长子序列

南阳214----单调递增子序列