【ACWing】1058。株取引V

件名アドレス:

https://www.acwing.com/problem/content/1060/

NNの長さを考えると配列のN、配列iii番号は、特定の株がiiにあることを示しますi-日の価格。最大利益を計算するアルゴリズムを設計します。次の制約の下で、できるだけ多くのトランザクションを完了することができます(株式を複数回売買する):同時に複数のトランザクションに参加することはできません(再度購入する前に前の株式を売却する必要があります)。株式を売却した後、翌日株式を購入することはできません(つまり、凍結期間は11です。1日)。

入力形式:
最初の行には整数NNが含まれていますNは配列の長さを表します。2行目にはNNが含まれていますN1000010000以下1 0 0 0 0は、完全な配列を表す正の整数です。

出力形式:
最大利益を表す整数を出力します

データ範囲:
1≤N≤1051≤N≤10^ 51N1 05

アイデアは動的計画法です。ステートマシンを使用してプロセス全体をシミュレートできます。保持、販売、凍結の3つの状態を設定します。ましょうF [i]が[0、1、2] Fを[I] [0,1,2]f [ i ] [ 0 1 2 ]はそれぞれiiを表します一日の終わりに3州で最大の利益I、およびセットIIi- dayの株価はp [i] p [i]p [ i ]、次のとおり
です。1。今日の保有は、昨日の保有と昨日の凍結から移すことができ、f [i] [0] =max⁡{f [i − 1] [0]、f [i − 1] [2] − p [i]} f [i] [0] = \ max \ {f [i-1] [0]、f [i-1] [2] -p [i] \}f [ i ] [ 0 ]=最大{ f [ i1 ] [ 0 ] f [ i1 ] [ 2 ]p [ i ] } ;
2.今日の売りは昨日の持ち株から移すことができるので、f [i] [1] = f [i − 1] [0] + p [i] f [i] [1] = f [ i-1] [0] + p [i]f [ i ] [ 1 ]=f [ i1 ] [ 0 ]+p [ i ] ;
3.今日の凍結は、昨日の凍結または昨日の販売から移行できるため、f [i] [2] =max⁡{f [i − 1] [2]、f [i − 1] [1] } f [i] [2] = \ max \ {f [i-1] [2]、f [i-1] [1] \}f [ i ] [ 2 ]=最大{ f [ i1 ] [ 2 ] f [ i1 ] [ 1 ] }
最後にmax⁡{f [n] [1]、f [n] [2]} \ max \ {f [n] [1]、f [n] [2] \}を返しますmax { f [ n ] [ 1 ] f [ n ] [ 2 ] }コードは次のように表示されます。

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int n;
int a[N], hold[N], sell[N], cool[N];

int main() {
    
    
    cin >> n;
    for (int i = 1; i <= n; i++) {
    
    
        cin >> a[i];
    }

    hold[0] = sell[0] = -1e9;
    for (int i = 1; i <= n; i++) {
    
    
        hold[i] = max(hold[i - 1], cool[i - 1] - a[i]);
        sell[i] = hold[i - 1] + a[i];
        cool[i] = max(cool[i - 1], sell[i - 1]);
    }

    cout << max(sell[n], cool[n]) << endl;

    return 0;
}

時間と空間の複雑さO(N)O(N)O N

おすすめ

転載: blog.csdn.net/qq_46105170/article/details/114427343