1 条题解

  • 0
    @ 2025-11-14 11:05:43
    • 参考 买卖股票4
    • 本题的不同在于,既可以 先买再卖,也可以 先卖再买
    #include <bits/stdc++.h>
    using namespace std;
    
    int maxProfit(vector<int>& a, int k) {
        int n = a.size(), inf = 1000000000;
        
        // d_1: 需要买入 1 个股票(之前卖了 1 个股票), 手上最大钱
        // d0 : 手上没有股票的最大钱
        // d1 : 手上有 1 个股票需要卖出,手上的最大钱
        vector<int> d_1(k + 1, -inf), d0(k + 1, 0), d1(k + 1, -inf);
        
        for (int i = 0; i < n; i++) {
            for (int j = k; j >= 1; j--) {
                d0[j]  = max({d0[j], d_1[j] - a[i], d1[j] + a[i]});  // max(啥也不干, 买 a[i], 卖 a[i])
                d_1[j] = max(d_1[j],  d0[j - 1] + a[i]);             // max(啥也不干, 卖 a[i])
                d1[j]  = max(d1[j],   d0[j - 1] - a[i]);             // max(啥也不干, 买 a[i])
            }
        }
        return d0[k];  
    }
    
    int main() {	
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        
        int n, k;
        cin >> n >> k;
        vector<int> a(n);
        for (int i = 0; i < n; i++) cin >> a[i];
        cout << maxProfit(a, k) << '\n';
        return 0;
    }
    
    • 1

    【普及】买卖股票的最佳时机_5

    信息

    ID
    178
    时间
    100ms
    内存
    32MiB
    难度
    5
    标签
    递交数
    41
    已通过
    18
    上传者