2.16 求数组中最长递增子序列
来源:互联网 发布:ios 模仿淘宝地址选择 编辑:程序博客网 时间:2024/06/07 05:45
题目:
求一个一维数组(N个元素)中最长递增子序列的长度
方法一:
DP题
代码如下:
#include <iostream>using namespace std;const int MAXN = 100000;const int INF = 10000000;int minV[MAXN], lis[MAXN], Array[MAXN];int n;//lis[i]表示从第i个元素开始的最长序列的长度//minV[i]表示所有长度为i的序列中,最大的元素的最小值//Array这个数组代表的是原始数组int LIS(int *A, int n) {int nMaxLen = 1; //数组最长递增子序列的长度for(int i = 0; i < n; ++i) lis[i] = 1; //初始化最长递增序列的信息 minV[0] = -INF;minV[1] = A[0];for(int i = 1; i < n; ++i) {//遍历历史最长递增序列信息int j = 0;//要提高效率的话,这里可以改为二分搜索for(j = nMaxLen; j >= 0; --j) {if(A[i] > minV[j]) {lis[i] = j + 1;break;}}//如果当前最长序列大于最长递增序列长度,更新最长信息if(lis[i] > nMaxLen) {nMaxLen = lis[i];minV[nMaxLen] = A[i];}else if(A[i] > minV[j] && A[i] < minV[j + 1]) {minV[j + 1] = A[i];}}return nMaxLen;}int main() {cin >> n;for(int i = 0; i < n; ++i) cin >> Array[i];cout << LIS(Array, n) << endl;return 0;}
方法二:
利用最长公共子序列,求最长递增子序列:
假设原数组是:(5,6,7,1,2,8)
要求他的最长递增子序列的话。
只需先将原数组进行排序!得到:(1,2,5,6,7,8)
然后再求这两个数组的lcs(最长公共子序列)
0 0
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- IDEA 环境常用设置整理
- iOS开发-内存管理
- 算法——利用Trie树统计某种前缀的单词的个数
- XML的四种解析方式
- Linux下Tomcat的安装配置
- 2.16 求数组中最长递增子序列
- 简约而不简单——Android SimpleAdapter
- Canvas---Canvas版画图,坐标轴绘制,网格绘制,橡皮筋式画直线
- 关于object.innerHTML的一点发现
- Jsp页面中获取系统当前日期
- 【c++笔记四】深入浅出的谈谈:引用(&)
- ubuntu root 失败
- hdu 1102 & poj 2421 Constructing Roads
- PHP类的学习