最长非递增子集

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:39:34

#include
#define NUM 10
int a[NUM];


int b[NUM];//存放以a[i](0<=i<=a.length-1)为最后元素的最大递减子串的长度。

int k;//存放最大递减子串最后一个元素的下标

//求出b[i]中最大的值(即是最大递减子串的长度),并将其下标存在k中
int Max() {
    int temp = 0;
    for (int i = 0; i < NUM; i++) {
        if (b[i] > temp) {
            temp = b[i];
            k = i;
        }
    }
    return temp;
}

// 以a[i](0<=i<=a.length-1)为最后元素的最大递增子串的长度存到b[i]中
int Lis() {
    b[0] = 1;//以a[0]为最后元素的子串只有a[0],所以长度为1.
    int k;
    for (int i = 1; i < NUM; i++) {
        k = 0;
        for (int j = 0; j < i; j++) {
            if (a[j] >= a[i] && k < b[j]) {
            //比较所有小于a[i]并位于a[i]前面的最大子串的长度。比如6,2,5,3,那么以3结尾的最大子串长度
            //等于:max{(大于3的元素有5,6)5的最大子串长度,6的最大子串长度}+1;
                k = b[j];
            }
        }
        b[i] = k + 1; 
    }
    return Max();
}

//从小到大输出递减子串
void print(int index){
    printf("%d ",a[index]);  
    for (int i = 0; i < index; i++) {
        if (b[i] == b[index] - 1 && a[i] >= a[index]) {
            print(i);
            break;
        }
    }
}

void main(){

for(int i = 0; i < NUM; i++)

scanf("%d",&a[i]);


    printf("最大非递增子串的长度为:%d\n",Lis());
    printf("最大递增子串从小到大输出为:\n");
    print(k);
}