动态规划——最长单调子序列

给定一个序列,求这个序列的最长上升子序列的长度,并输出这个最长上升子序列,题目保证,最长上升子序列只有一个。

我这里的思路是再设一个数组b,如果a[k]>a[i],则b[k]=b[i]+1.然后最后找到b中最大值的位置,然后再慢慢倒推回去找,得到数组

#include<stdio.h>
int max(int *b,int n){
    int max=b[0];
    int j=0;
    for(int i=n-1;i>=0;i--){
        if(b[i]>max){
            max=b[i];
            j=i;
        }
    }
    return j;
}
void maxlength(int *a,int n){
    int b[n];
    for(int i=0;i<n;i++){
        b[i]=1;
    }
    for(int i=1;i<n;i++){
        int max=0;
        for(int j=0;j<=i;j++){
            if(a[i]>a[j]){
                b[i]=b[j]+1;
            }
            if(b[i]>max){
                max=b[i];
            }
        }
        b[i]=max;
    }
    int d=max(b,n);
    int e=b[d];
    printf("%d\n",e);
    int f[e];
    int o=e;
    e--;
    f[e]=a[d];
    while(e){
        for(int i=0;i<d;i++){
            if(b[i]==e&&f[e]>a[i]){
                e--;
                f[e]=a[i];
            }
        }
    }
    for(int i=0;i<o;i++){
        printf("%d ",f[i]);
    }
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    maxlength(a,n);
}

 

posted @ 2021-05-27 15:37  ....陈陈陈陈  阅读(75)  评论(0)    收藏  举报