完美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 }
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号