ここでのオリジナルタイトルリンク:https://leetcode.com/problems/minimum-cost-for-tickets/
トピック:
列車の旅のための人気の国では、事前に1年を旅行するいくつかの列車を計画しています。あなたが移動する年の日数を配列として与えられています days
。毎日の整数である 1
と 365
。
列車のチケットは3種類の方法で販売されています:
- 1日パスがために販売されている
costs[0]
ドル。 - 7日間のパスがのために販売されている
costs[1]
ドル。 - 30日間のパスがのために販売されている
costs[2]
ドル。
パスが連続した旅行の多くの日を許します。私たちは2日目の7日間のパスを取得した場合、我々は7日間旅行することができます:1日2、3、4、5、6、7、および8。
あなたが与えられたリストに毎日旅行する必要があるドルの最小数を返します days
。
例1:
入力:日= [1,4,6,7,8,20]、コスト= [2,7,15]
出力:11
説明:
たとえば、ここにあなたがあなたの旅行プランを旅行することができますパスを購入する1つの方法は次のとおりです。
1日目に、あなたは1日目覆っコスト[0] = $ 2用の1日券購入
、あなたは日3、4カバーコスト[1] = $ 7のために7日間のパスを、買って、3日目に...、9。
20日目に、あなたは一日20覆われたコスト[0] = $ 2のための1日パス買った
あなたは$ 11費やし、あなたのご旅行のすべての日をカバーし、合計では。
例2:
入力:日= [1,2,3,4,5,6,7,8,9,10,30,31]、コスト= [2,7,15]
出力:17
説明:
たとえば、ここでは1がありますあなたの旅行プランを旅行することができますパスを購入する方法は:
1日目に、あなたは、2、1日目を覆っている[2] = $ 15の費用のための30日間のパスを買って...、30
日31日に、あなたが購入しましたコストのための1日パスは、[0] 31日目覆った$ = 2
、あなたは$ 17費やし、あなたのご旅行のすべての日をカバーし、合計で。
注意:
1 <= days.length <= 365
1 <= days[i] <= 365
days
厳密に昇順です。costs.length == 3
1 <= costs[i] <= 1000
ソリューション:
旅行を必要としないすべての日のために、その分のコストは、前日と同じでなければなりません。
それは移動が必要とされる日になると、3つのオプション、前日の最小コストの1日パス+アップがあり、7日は+アップ前の7日間最小コストに合格し、30日には、過去30日間最小コストに+を渡します。
時間計算:O(n)を。N =日間[days.length-1]。
スペース:O(n)を。
ACのJava:
1 クラスソリューション{ 2 公共 INT mincostTickets(INT []日は、値int []コスト){ 3 INT LASTDAY =日間[days.length-1 ]。 4 INT [] DP = 新しい INT [LASTDAY + 1 ]。 5 INT IND = 0 。 6 のためには、(int型私は++; I <= LASTDAY I =日[0] ){ 7を 場合(!I = 日間[IND]){ 8 DP [I] = DP [I-1 ]; 9 } 他{ 10 DP [I] = Math.min(DP [I-1] +コスト[0]、Math.min(DP [Math.max(0、I-7)] +コスト[1]、DP [Math.max( 0、I-30)] +コスト[2 ]))。 11 IND ++ ; 12 } 13 } 14 15 戻りDP [LASTDAY]。 16 } 17 }
真実は、我々は唯一の最後の30代のデータを維持する必要があります。
したがって、30日にDP配列を制限couls。
時間計算:O(n)を。
スペース:O(1)。
ACのJava:
1 クラスソリューション{ 2 公共 INT mincostTickets(INT []日は、値int []コスト){ 3 のint [] DP = 新しい INT [30 ]。 4 INT IND = 0 。 5 のための(int型 ;私は=日<days.length-1] I ++は、I =日[0] ){ 6 場合(!I = 日間[IND]){ 7 DP [I%30] DPを= [(I -1)%30 ]。 8 } 他{ 9 DP [I%30] = Math.min(DP [(I-1)30重量%] +コスト[0]、Math.min(DP [Math.max(0、I-7)30%] +コスト[1 ]、DP [Math.max(0、I-30)30%] +コスト[2 ]))。 10 IND ++ ; 11 } 12 } 13 14 戻り DP [日[days.length-1]%30 ]。 15 } 16 }
同様のコインを変更。