可以使用动态规划来解决这个问题。

首先定义一个数组dp,dp[i]表示以第i个数结尾的最长不下降子序列的长度。

对于dp[i],遍历所有的j(0 <= j < i),如果a[j] <= a[i],说明a[i]可以接在以a[j]结尾的不下降子序列后面,即dp[i] = max(dp[i], dp[j] + 1)。

最后遍历dp数组,找到最大值,即为最长不下降子序列的长度。

以下是对应的C++代码实现:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    
    vector<int> dp(n, 1);
    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[j] <= nums[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }
    
    int maxLength = *max_element(dp.begin(), dp.end());
    cout << maxLength << endl;
    
    return 0;
}

该算法的时间复杂度为O(n^2),可以满足题目给出的数据范围

描述设有由n个不相同的整数组成的数列记为 a1、a2、……、an且aiaj ij。例如318714101223411624。若存在i1i2i3… ie且有ai1ai2… aie则称为长度为e的不下降序列。如上例中3182324就是一个长度为4的不下降序列同时也有3710121624长度为6的不下降序列。程序要求当原数列给出之后求出最长的不下降序列。输入描述第一行为n表示n个数10=n=100

原文地址: https://www.cveoy.top/t/topic/iOA5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录