求最长的上升子序列
来源:互联网 发布:java解压缩rar文件 编辑:程序博客网 时间:2024/06/05 15:13
题目:
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)或(1, 3, 4, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。
#include <iostream>#include <vector>using namespace std;const int MaxNum = 10000;int main(){ int N; int Num[MaxNum + 1]; int MaxLen[MaxNum + 1]; vector<int> ivec; cin >> N; for(int i = 0; i < N; ++i) { cin >> Num[i]; } MaxLen[0] = 1; for(int i = 1; i < N; ++i) { int nTmp = 0; int TmpMax = 0; for(int j = 0; j < i; ++j) { if(Num[i] > Num[j])//MaxLen[j]的值,就是在Num[i]左边,终点数小于b[i], { if(MaxLen[j] > nTmp) //且长度最长的那个上升子序列的 nTmp = MaxLen[j]; //长度加1比如:1,3,5,2,6,7,3 } } MaxLen[i] = nTmp + 1;//记录每个i对应的长度 } int nTmpMax = 0; //找出最长的上升序列的长度 int j = 0;//记录具有最长长度的位置 for(int i = 0; i < N; ++i) { if(MaxLen[i] > nTmpMax) { nTmpMax = MaxLen[i]; j = i; } } cout << nTmpMax << endl; //显示出最长序列 int x = nTmpMax - 1; ivec.push_back(Num[j]); for(int i = j - 1;0 <= i; --i) { if(Num[i] < Num[j]) { if(MaxLen[i] != x) { continue; } --x; ivec.push_back(Num[i]); } } for(vector<int>::iterator iter = ivec.end() - 1; iter != ivec.begin() - 1; --iter) { cout << *iter << " "; } return 0;}
- 求最长的上升子序列
- 求最长上升子序列的长度
- 求最长上升子序列的长度
- 求最长上升子序列的问题
- 求最长上升子序列
- 求最长上升子序列
- 求最长上升子序列
- 求最长上升子序列
- 求最长上升子序列
- hdu1025!求最长上升子序列的另种方法!!!!
- 动态规划求最长上升子序列
- STL求最长上升子序列
- lis求最长上升子序列问题
- 动态规划:求最长上升子序列
- 求最长上升不一定连续子序列
- 二分求最长上升子序列
- LIS 求最长上升子序列长度
- 动态规划----求最长上升子序列
- 写给测试新人
- stm32的定时器和PWM
- C/C++——浅谈函数宏应用优缺点
- Hibernate基于注解方式的各种映射全面总结
- 【Java教程】第二讲 Java语言基础知识
- 求最长的上升子序列
- LeetCode - Pow(x, n)
- UVA1366-----Martian Mining------DP
- android MotionEvent
- 7.8 赫夫曼树应用解析(跟结点到叶子求每个字符的赫夫曼编码)
- 《C语言深度剖析》学习笔记----C语言中的符号
- mysql解决中文乱码问题
- 计算角色和物体之间距离来触发动画【Unity3d】
- 对《RHCSA/RHCE Red Hat Linux认证学习指南(第6版):EX200 & EX300》的评价