计蒜客 难题题库 142 求数组的最长递减子序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/changshu1/article/details/47394263

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

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

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

样例1

输入:

8
9 4 3 2 5 4 3 2

输出:

9 5 4 3 2


#include<iostream>
#include<vector>
using namespace std;

int main(){
    int n, i, j;
    cin >> n;
    vector<int> h(n, 0);
    vector<int> dp(n, 1);
    vector<int> pre(n, -1);
    for(i = 0; i < n; ++i){
        cin >> h[i];
    }
    for(i = 1; i < n; ++i){
        for(j = 0; j < i; ++j){
            if(h[j] > h[i] && dp[j] + 1 > dp[i]){
                dp[i] = dp[j] + 1;
                pre[i] = j;
            }
        }
    }
    int max_len = 1;
    j = 0;
    for(i = 0; i < n; ++i){
        if(max_len < dp[i]){
            max_len = dp[i];
            j = i;
        }
    }
    vector<int> res;
    while(j != -1){
        res.push_back(h[j]);
        j = pre[j];
    }
    vector<int>::reverse_iterator rIt = res.rbegin();
    cout << *rIt;
    while(++rIt != res.rend()){
        cout << " " << *rIt;
    }
    cout << endl;
}


阅读更多
换一批

没有更多推荐了,返回首页