完美2017实习 最长递增子序列

题目:

给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)
例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6.

输入描述:

第一行包含一个整数T,代表测试数据组数。
对于每组测试数据: N-数组的长度
a1 a2 ... an (需要计算的数组)
保证:
1<=N<=3000,0<=ai<=MAX_INT.

输出描述:

对于每组数据,输出一个整数,代表最长递增子序列的长度。

 

输入例子:
2
7
89 256 78 1 46 78 8
5
6 4 8 2 17

 

输出例子:
3
3

思路:动态规划

维护一个数组res,res[i]表示以第i个字符结尾的子序列长度 

一个整型数组,求其中最长递增子序列的长度。

简单的想法:从前到后遍历数组,对于每一个元素,从该元素开始往前判断是不是大于前面的元素,如果大于,则根据是否大于当前位置的最长子序列长度,相应的更新当前这个子序列的长度。

代码:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int getMaxSub(vector<int> v)
 6 {
 7     int size = v.size();
 8     vector<int> len(size,1);
 9     //res[i]代表以第i个元素结尾的长度
10     for (int i = 0; i < size; ++i)
11     {
12         for (int j = 0; j < i; ++j)
13         {
14             if (v[j] < v[i] && len[i] < len[j] + 1)
15             {
16                 len[i] = len[j] + 1;
17 
18             }
19         }
20     }
21 
22     int max = -1;
23 
24     for (auto num : len)
25     {
26         if (max < num)
27             max = num;
28     }
29 
30     return max;
31 }
32 
33 int main()
34 {
35     int T;
36     cin >> T;
37     vector<int> v;
38     while (T--)
39     {
40         int size;
41         cin >> size;
42         int temp;
43         for (int i = 0; i < size; ++i)
44         {
45             cin >> temp;
46             v.push_back(temp);
47         }
48         
49         cout << getMaxSub(v) << endl;
50         v.clear();
51     }
52     return 0;
53 }

 

posted @ 2016-08-21 22:54  zhangbaochong  阅读(431)  评论(0)    收藏  举报