最长递增子序列B(完美2017实习生)
2016-07-04 22:48
281 查看
最长递增子序列B
1、题目:给定一个长度为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.
输出描述:
对于每组数据,输出一个整数序列,代表最长递增子序列。
若有多组最长上升子序列,输出第一组。
保证:1<=T<=20,1<=N<=3000,0<=ai<=MAX_INT.
输入例子:
2
7
89 256 78 1 46 78 8
5
6 4 8 2 17
输出例子:
1 46 78
6 8 17
2、代码:
#include <iostream> #include <vector> using namespace std; void getLongB(const vector<int> v, vector<int> *vResult) { vector<int> big(v.size(), 1); int i = 0; for (auto iter = v.cbegin();iter != v.cend();++iter) { int max = 1, j = 0; for (auto iter1 = v.cbegin();iter1 != iter;++iter1, ++j) { if (*iter > *iter1 && big[j] + 1>max) { max = big[j] + 1; } } big[i++] = max; } int max = 0; vector<int>::const_iterator iterMax; for (auto iter = big.cbegin();iter != big.cend();++iter) { if (*iter > max) { max = *iter; iterMax = iter; } } //回溯 auto iterBeg = big.cbegin(); vResult->push_back(v[iterMax - iterBeg]); for (auto iter = iterBeg;iter !=iterMax&&max!=0;) { if (*iter == max - 1&& v[iter - iterBeg]<v[iterMax - iterBeg]) { vResult->push_back(v[iter - iterBeg]); --max; iterMax = iter; iter = iterBeg; } else { ++iter; } } } int main() { int n; cin >> n; vector<vector<int>> v(n); for (int i = 0;i < n;++i) { int n1; cin >> n1; vector<int> v1(n1); for (int j = 0;j < n1;++j) { int a; cin >> a; v1[j] = a; } v[i] = v1; } vector<int> vResult; for (int i = 0;i < n;++i) { getLongB(v[i], &vResult); for (auto iter=vResult.crbegin();iter!=vResult.crend();++iter ) { cout << *iter ; if (iter + 1 != vResult.crend()) { cout << " "; } } vResult.clear(); cout << endl; } // system("pause"); return 0; }
3、总结:
动态规划回溯问题。
相关文章推荐
- Android Studio导入项目非常慢的解决办法
- 千份位Javascript Thousand Separator / string format
- dmidecode
- Matlab绘制三维线性图形
- 数据库中where 1=1 的用法
- MySql主从架构之-概述
- 算法:数组找出2个只出现一次的数字(其他元素出现两次)
- C#:生成短网址
- 替代Protocol buffers 的FlatBuffers:高效利用内存的序列化函数库(Unity中测试)
- 算子(operator)的学习(一)
- WebRTC手记Channel概念
- sqrt 源代码
- 《癌症·真相:医生也在读》:癌症新药专家的癌症防治科普,重点是免疫疗法。四星推荐。
- Spark性能优化指南——基础篇
- String字符串对象
- 菜鸟日记第二篇
- 逆向工程之表达式优化识别(2)-乘法
- 技巧与知识
- Rename Filenames Wirth Full Angular-Chinese
- PAT (Advanced Level) 1097. Deduplication on a Linked List (25)