動的計画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]の価格)。 } を返す現金を。 } }