赞
踩
最长递增子序列问题
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.
代码:
//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]; //返回最长递增子序列的长度 }
可执行代码:
#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); }
时间复杂度O(n^2)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。