求数组的最长递减子序列

给定一个整数序列,输出它的最长递减(注意不是“不递增”)子序列。

输入包括两行,第一行包括一个正整数N(N<=1000),表示输入的整数序列的长度。第二行包括用空格分隔开的N个整数,整数范围区间为[-30000,30000]。

输出为一行,最长递减子序列的结果,数字间用空格分隔(测试case中只会有一个最长递减子序列)。

样例1

输入:

8
9 4 3 2 5 4 3 2

输出:

9 5 4 3 2

思路:求最长递减序列,我的做法是把输入数据反向,然后求用我会做的求最长递增序列,当然我用的求法不是O(n^2)的,那样我觉得会超时,所以我用的O(nlogn)的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
int g[30010],num[30010],d[30010];
int main(){
    int n;
    scanf("%d",&n);
    int inf=0x7fffffff;
    fill(g,g+n,inf);
    for(int i=0;i<n;++i){
        scanf("%d",&num[n-1-i]);
    }
    //核心代码begin
    for(int i=0;i<n;++i){
        int j=lower_bound(g,g+n,num[i])-g;
        g[j]=num[i];
        d[i]=j+1;
    }
    //end
    int s=*max_element(d,d+n);
    for(int i=n-1;i>=0;--i)
    {
        if(s==d[i])
        {
            if(s!=1)
                printf("%d ",num[i]);
            else
                printf("%d\n",num[i]);
            --s;
        }
    }
    return 0;
}

打个小广告

欢迎加入我的知识星球「基你太美」,我会在星球中分享 AucFrame 框架、大厂面经、AndroidUtilCode 更详尽的说明…一切我所了解的知识,你可以通过支付进入我的星球「基你太美」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美+你的星球昵称)加我个人微信,方便我后续拉你进群(PS:进得越早价格越便宜)。

我的二维码