//这里实现一个严格的最长递减子序列。
#include<iostream>
using namespace std;
#define length 20
int main() {
//序列
int a[ length ];
//b[i]=j表示数组a中以第i个位置为尾的最长递减子序列的前一个元素在数组a中第j个位置
int b[ length ];
//c[i]=j表示数组a中以第i个位置为尾的最长递减子序列的子序列长度是j
int c[ length ];
//最长有序子序列的尾部元素在a中的位置
int max_tail = 0;
int i = 0;
int j = 0;
int max_length = 1;
for( i = 0 ; i < length ; i ++ ) {
a[ i ] = rand() % length;
b[ i ] = i;
c[ i ] = 1;
}
for( i = 0 ; i< length ; i ++ ) {
cout << a[ i ] << " ";
}
cout << endl;
for( i = 1 ; i < length ; i ++ ) {
int temp_max_length = 0;
int temp_pos = i;
for( j = 0 ; j < i ; j ++ ) {
if( ( a[ j ] > a[ i ] ) && ( temp_max_length < c[ j ] ) ) {
temp_max_length = c[ j ];
temp_pos = j;
}
}
if( temp_pos != i ) {
b[ i ] = temp_pos;
c[ i ] = temp_max_length + 1;
if( c[ i ] > max_length ) {
max_length = c[ i ];
max_tail = i;
}
}
}
//输出递减子序列,注意,下面的输出是从后向前输出的,即由小到大输出的
i = max_tail;
while( b[ i ] != i ) {
cout << a[ i ] << " ";
i = b[ i ];
}
cout << a[ i ];
cout << endl;
return 1;
}
最长有序子序列
最新推荐文章于 2021-01-16 16:57:34 发布