1 条题解

  • 0
    @ 2026-10-26 22:50:07

    思路与算法

    维护以升或降趋势结尾的最长摆动长度;当前与上一高度比较,升则up=down+1,降则down=up+1,相等不变。

    正确性说明

    同向连续上升时保留更高末端不减少已有长度且更利于下一次下降,连续下降同理保留更低末端;相等无益。每次真正转向可增加一个交替段,两个趋势状态的局部替换归纳得到最长摆动子序列。

    复杂度

    O(n)时间、O(1)额外空间,流式读入,常数状态初始化。

    易错点

    严格不等,等高不增加;不是最长单调上升子序列,只有一株时答案1。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        long long last;
        cin >> last;
        int up = 1, down = 1;
        while (--n) {
            long long x;
            cin >> x;
            if (x > last)
                up = down + 1;
            else if (x < last)
                down = up + 1;
            last = x;
        }
        cout << max(up, down) << "\n";
    }
    
    • 1

    信息

    ID
    1913
    时间
    1000ms
    内存
    128MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者