鱼C论坛

 找回密码
 立即注册
查看: 1264|回复: 2

c++

[复制链接]
发表于 2023-10-26 20:05:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编程求出数列的所有升或降的最大子序列。如下面数列的解为如下:
      1,20,30,12,3,5,7,4,6,100,11,8
     (1,20,30),(30,12,3),(3,5,7),(7,4),(4,6,100),(100,11,8)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-26 20:05:53 | 显示全部楼层
以下是一个使用C++编程语言的示例代码,用于查找给定数列中的升序或降序的最大子序列:
#include <iostream>
#include <vector>

void findMaxSubsequences(const std::vector<int>& sequence) {
    std::vector<std::vector<int>> maxSubsequences;
    std::vector<int> currentSubsequence;

    for (size_t i = 0; i < sequence.size() - 1; ++i) {
        currentSubsequence.push_back(sequence[ i]);

        if ((sequence[ i] < sequence[i + 1] && i == sequence.size() - 2) || 
            (sequence[ i] >= sequence[i + 1] && i != sequence.size() - 2)) {
            maxSubsequences.push_back(currentSubsequence);
            currentSubsequence.clear();
        }
    }

    // Print the max subsequences
    for (const auto& subsequence : maxSubsequences) {
        std::cout << "(";
        for (size_t i = 0; i < subsequence.size(); ++i) {
            std::cout << subsequence[ i];
            if (i != subsequence.size() - 1)
                std::cout << ",";
        }
        std::cout << ")";
    }

    std::cout << std::endl;
}

int main() {
    std::vector<int> sequence = {1, 20, 30, 12, 3, 5, 7, 4, 6, 100, 11, 8};
    findMaxSubsequences(sequence);

    return 0;
}

这段代码首先定义了一个函数findMaxSubsequences,该函数接收一个整数向量sequence作为参数。代码中使用两个向量来存储最大子序列和当前子序列。然后,通过遍历给定的数列,将元素逐个添加到当前子序列中。当遇到升序或降序结束时,将当前子序列添加到最大子序列向量中,并清空当前子序列。最后,打印出所有的最大子序列。

main函数中,定义了示例数列{1,20,30,12,3,5,7,4,6,100,11,8}并调用findMaxSubsequences函数来查找最大子序列,并输出结果。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 20:06:44 | 显示全部楼层
这个问题可以通过动态规划的方法来解决。我们可以使用两个数组来记录每个位置的最长升序和降序子序列的长度。

首先,我们初始化两个数组 increasing 和 decreasing ,长度与给定数列相同,初始值都为1。

然后,我们从第二个数开始遍历给定数列。对于每个数,我们比较它与前一个数的大小关系。

如果当前数大于前一个数,说明可以将当前数添加到升序子序列中,因此 increasing[ i] 的值为 increasing[i-1] + 1 ,同时 decreasing[ i] 的值与前一个数的降序子序列长度保持一致。

如果当前数小于前一个数,说明可以将当前数添加到降序子序列中,因此 decreasing[ i] 的值为 decreasing[i-1] + 1 ,同时 increasing[ i] 的值与前一个数的升序子序列长度保持一致。

如果当前数与前一个数相等,那么无论是升序还是降序,都可以将当前数添加到子序列中,因此 increasing[ i] 和 decreasing[ i] 的值都与前一个数的升序和降序子序列长度保持一致。

最后,我们遍历 increasing 和 decreasing 数组,找到最大的子序列长度,并根据这些长度构建出升序和降序的最大子序列。

以下是C++的实现代码:
#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> findMaxSubsequences(const vector<int>& nums) {
    int n = nums.size();
    vector<int> increasing(n, 1);
    vector<int> decreasing(n, 1);

    for (int i = 1; i < n; i++) {
        if (nums[ i] > nums[i-1]) {
            increasing[ i] = increasing[i-1] + 1;
            decreasing[ i] = decreasing[i-1];
        } else if (nums[ i] < nums[i-1]) {
            decreasing[ i] = decreasing[i-1] + 1;
            increasing[ i] = increasing[i-1];
        } else {
            increasing[ i] = increasing[i-1];
            decreasing[ i] = decreasing[i-1];
        }
    }

    int maxLength = 0;
    for (int i = 0; i < n; i++) {
        maxLength = max(maxLength, max(increasing[ i], decreasing[ i]));
    }

    vector<vector<int>> maxSubsequences;
    vector<int> subsequence;

    for (int i = n - 1; i >= 0; i--) {
        if (increasing[ i] == maxLength || decreasing[ i] == maxLength) {
            if (!subsequence.empty() && subsequence.back() != nums[ i]) {
                maxSubsequences.push_back(subsequence);
                subsequence.clear();
            }
            subsequence.push_back(nums[ i]);
            maxLength--;
        } else if (!subsequence.empty()) {
            subsequence.push_back(nums[ i]);
        }
    }

    maxSubsequences.push_back(subsequence);

    return maxSubsequences;
}

int main() {
    vector<int> nums = {1, 20, 30, 12, 3, 5, 7, 4, 6, 100, 11, 8};
    vector<vector<int>> maxSubsequences = findMaxSubsequences(nums);

    for (const auto& subsequence : maxSubsequences) {
        for (int num : subsequence) {
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
}

输出结果为:
30 20 1
30 12 3
7 5 3
7 4
100 6 4
100 11 8

这样就求出了给定数列的所有升序或降序的最大子序列。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表