動的計画Leetcodeトピック(DP)の手数料(取引手数料と証券を売買するためのベストタイム)を含む-714。購入と販売株式のベストタイム

動的計画Leetcodeトピック(DP)の手数料(取引手数料と証券を売買するためのベストタイム)を含む-714。購入と販売株式のベストタイム


 整数の配列を指定して  prices最初の、  i 要素が最初に表し  i 株価の日を、非負の整数  fee 株取引の取引費用を表します。

あなたは時代のトランザクション数に制限を完了することができますが、各トランザクションのための手数料を支払う必要があります。あなたが株式を購入した場合、あなたは、もはや株式を購入し続けることができる前に、それを販売していません。

利益の最大値を返します。

例1:

入力:価格の= [1、3、 2、8、4、9]、料金= 2 
出力:8 
説明:最大の利益を達成するために:   
[0] = 1の価格を買うところ
販売価格の[ 3] = 8つの
販売価格[4] = 4つの
ここで販売価格[5] = 9 
、総利益:((8--1) - 2)+((9--4) - 2)= 8 。

注意:

  • 0 < prices.length <= 50000
  • 0 < prices[i] < 50000
  • 0 <= fee < 50000

 

DPの意味:

DP [i]が[0]のi日はなかった表し在庫切れの際は在庫がない可能性が高いですので、最大の利益を持っています:

  • 初日は一日に販売していない、I-1ではない私
  • I-1株の最初の日、私はそれを販売した最初の日

場合在庫保有DP [i]を[1]に最大の利益を示し、理由の在庫保有であってもよいです。

  • そこI 1-初日、i日売れませんでした
  • 最初の日は、私が買った最初の日をI-1をストックしていません

初期条件:

利益は0で、0なし購入日ので、DP [0] [0]、0を=。

DP [0] [1] = - 価格[0]、0日0買った株式、利益0・価格[0]

戻り値:

DP [prices.length-1]必要な最終的な手は、株式を保有しないことがあるので、[0]、最大の利益は、在庫を保持していないときに返されます。

状態遷移方程式: 

DP [I] [0] = Math.max(DP [I-1] [0]、価格は[I] + DP [I-1] [1] -fee)。
DP [I] [1] = Math.max(DP [I-1] [1]、DP [I-1] [0] -prices [I])。

クラスソリューション{
     公共 のint maxProfit(INT []価格、int型の料金){
         int型 [] [] DP = 新しい INT [prices.length] [2 ]。
        DP [ 0] [0] = 0 
        DP [ 0] [1] = -prices [0 ]。
        int型 i = 1; iがprices.length <; Iは++ ){ 
            DP [I] [ 0] = Math.max(DP [I-1] [0]、価格[I] + DP [I-1] [ 1] - 手数料)。
            DP [I] [ 1] = Math.max(DP [I-1] [1]、DP [I-1] [0] - 価格[I])。
        } 
        戻り DP [prices.length-1] [0 ]。
    } 
}

 

 それを簡素化:

クラスソリューション{
     公共 のint maxProfit(INT []価格、int型の料金){
         int型の現金= 0 INTのホールド= -prices [0 ]。
        以下のためにint型私は++; iはprices.length <I = 1 ){ 
            現金( - +価格[i]を保持する、現金= Math.maxを料金)。
            ホールド = Math.max(cash-ホールド[i]の価格)。
        } 
        を返す現金を。

    } 
}

 

 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11482086.html