当前位置:   article > 正文

算法-动态规划3组合问题-最长递增子序列问题_三、递增子序列问题 【问题描述】 小明最近对数列特别感兴趣,尤其想研究一个数列

三、递增子序列问题 【问题描述】 小明最近对数列特别感兴趣,尤其想研究一个数列

算法-动态规划3-最长递增子序列问题

最长递增子序列问题
LIS问题描述:给出一个数列A,求A的一个长度最大的子数列B,使得B是一个递增数列。

例如:
数列A:5,2,8,6,3,6,9,7
一个递增的子数列为5,8,9;
一个长度最大的递增子数列为2,3,6,9或者2,3,6,7,则其最大长度为4.
  • 1
  • 2
  • 3
  • 4

代码:

//a为原数组,n为数组长度,L为存储最长递增子序列的长度的数组,x[][]为对应的最长子序列
int increate(int a[], int n) {
	int L[10], x[10][10];
	int i,j,k,z=0;
	for (i = 0; i < n; i++) {	//初始化,最长递增子序列长度为1
		L[i] = 1;
		x[i][0] = a[i];
	}

	for (i = 1; i < n; i++) {	//依次计算a[0]~a[i]的最长递增子序列
		int max = 1;
		for (j = i - 1; j >= 0; j--) {	//对于所有a[j]<a[i]
			if ((a[j] < a[i]) && (max < L[j] + 1)) {
				max = L[j] + 1;
				L[i] = max;
				//cout << i<<max << endl;
				for (k = 0; k < max - 1; k++) {		//存储最长递增子序列
					x[i][k] = x[j][k];	//不断继承x[i][0~max-2]
				}
				x[i][max - 1] = a[i];
			}
		}
	}
	
	for (z=0,i = 1; i < n; i++) {		//求所有递增子序列的最大长度
		//cout << L[i] << endl;
		if (L[z] < L[i]) {
			z = i;
		}
	}
	//cout << z;
	cout << "最大递增子序列是:";
	for (i = 0; i < L[z]; i++) {	//输出最大递增子序列
		cout << x[z][i] << " ";
	}
	cout << endl;
	return L[z];		//返回最长递增子序列的长度
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

可执行代码:

#include<iostream>
using namespace std;

//a为原数组,n为数组长度,L为存储最长递增子序列的长度的数组,x[][]为对应的最长子序列
int increate(int a[], int n) {
	int L[10], x[10][10];
	int i,j,k,z=0;
	for (i = 0; i < n; i++) {	//初始化,最长递增子序列长度为1
		L[i] = 1;
		x[i][0] = a[i];
	}

	for (i = 1; i < n; i++) {	//依次计算a[0]~a[i]的最长递增子序列
		int max = 1;
		for (j = i - 1; j >= 0; j--) {	//对于所有a[j]<a[i]
			if ((a[j] < a[i]) && (max < L[j] + 1)) {
				max = L[j] + 1;
				L[i] = max;
				//cout << i<<max << endl;
				for (k = 0; k < max - 1; k++) {		//存储最长递增子序列
					x[i][k] = x[j][k];	//不断继承x[i][0~max-2]
				}
				x[i][max - 1] = a[i];
			}
		}
	}
	
	for (z=0,i = 1; i < n; i++) {		//求所有递增子序列的最大长度
		//cout << L[i] << endl;
		if (L[z] < L[i]) {
			z = i;
		}
	}
	//cout << z;
	cout << "最大递增子序列是:";
	for (i = 0; i < L[z]; i++) {	//输出最大递增子序列
		cout << x[z][i] << " ";
	}
	cout << endl;
	return L[z];		//返回最长递增子序列的长度
}

int main() {
	int n;
	int a[100];
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	cout << increate(a,n);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

在这里插入图片描述
时间复杂度O(n^2)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/521446
推荐阅读
相关标签
  

闽ICP备14008679号