算法-动态规划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.
代码:
//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)。