問題描述
在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。
火車票有三種不同的銷售方式:
一張為期一天的通行證售價為 costs[0] 美元;
一張為期七天的通行證售價為 costs[1] 美元;
一張為期三十天的通行證售價為 costs[2] 美元。
通行證允許數天無限制的旅行。 例如,如果我們在第 2 天獲得一張為期 7 天的通行證,那麼我們可以連著旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。
返回你想要完成在給定的列表 days 中列出的每一天的旅行所需要的最低消費。
示例1:
輸入:days = [1,4,6,7,8,20], costs = [2,7,15]示例2:輸出:11
解釋:例如,這裡有一種購買通行證的方法,可以讓你完成你的旅行計畫:
在第 1 天,你花了 costs[0] = $2 買了一張為期 1 天的通行證,它將在第 1 天生效。
在第 3 天,你花了 costs[1] = $7 買了一張為期 7 天的通行證,它將在第 3, 4, …, 9 天生效。
在第 20 天,你花了 costs[0] = $2 買了一張為期 1 天的通行證,它將在第 20 天生效。
你總共花了 $11,並完成了你計畫的每一天旅行。
輸入:days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]輸出:17
解釋:例如,這裡有一種購買通行證的方法,可以讓你完成你的旅行計畫:
在第 1 天,你花了 costs[2] = $15 買了一張為期 30 天的通行證,它將在第 1, 2, …, 30 天生效。
在第 31 天,你花了 costs[0] = $2 買了一張為期 1 天的通行證,它將在第 31 天生效。
你總共花了 $17,並完成了你計畫的每一天旅行。
1 <= days.length <= 365演算法思想1 <= days[i] <= 365
days 按順序嚴格遞增
costs.length == 3
1 <= costs[i] <= 1000
這道題並沒有什麼彎彎繞,演算法思想很dp
我們想,當我們處在第n天的時候當前所需費用最低應該是多少呢?
應該是昨天的費用加上只旅遊一天的費用的和 與 7天前的費用加上旅行7天的費用的和 與 30天前的加上旅行30天所需費用的和三者最小的就是今天的最低費用
不過有一點值得注意的是,如何處理天數不滿7天或者30天的情況
其實這一點我最開始沒有考慮到,就慣性思維覺得七天內的就不要考慮7天、30天的費用,但是題目並沒有說 花7天的錢或者30天的前一定會旅行這麼多天,而7天、30天**不一定比天數不滿這些天所計算的費用高,所以在天數不滿的時候也需要比較。
至於加不加這種比較對結果有沒有什麼影響,我覺得還是嚴謹一點加上比較好。畢竟不管究竟是不是題目沒說嚴謹咱們自己做題還是要嚴謹。
c++ code
class solution
if(i <7)
dp[1]
[i]=
min(dp[1]
[i -1]
+ costs[0]
,min
(costs[1]
, costs[2]
));else
if(i <30)
dp[1]
[i]=
min(dp[1]
[i -1]
+ costs[0]
,min
(dp[1]
[i -7]
+ costs[1]
, costs[2]
));else
dp[1]
[i]=
min(
min(dp[1]
[i -1]
+ costs[0]
, dp[1]
[i -7]
+ costs[1]
), dp[1]
[i -30]
+ costs[2]
);}return dp[1]
[last_day];}
};
python codeclass
solution
:def
mincosttickets
(self, days: list[
int]
, costs: list[
int])-
>
int:
last_day = days[
len(days)-1
] dp =[[
0for i in
range
(last_day +1)
]for i in
range(2
)]for i in days: dp[0]
[i]=
1for i in
range(1
, last_day +1)
:ifnot dp[0]
[i]: dp[1]
[i]= dp[1]
[i -1]
;continue
if i <7:
dp[1]
[i]=
min(dp[1]
[i -1]
+ costs[0]
, costs[1]
, costs[2]
)elif i <30:
dp[1]
[i]=
min(dp[1]
[i -1]
+ costs[0]
, dp[1]
[i -7]
+ costs[1]
, costs[2]
)else
: dp[1]
[i]=
min(dp[1]
[i -1]
+ costs[0]
, dp[1]
[i -7]
+ costs[1]
, dp[1]
[i -30]
+ costs[2]
)return dp[1]
[last_day]
力扣 動態規劃
設爬x層的梯子的方法有f x 種,那麼f x f x 1 f x 2 爬1層梯子的方式有一種 爬2層梯子的方式有兩種 爬3層梯子的方式有三種 爬4層梯子的方式有五種 classsolution int rev newint n 1 rev 0 0 rev 1 1 rev 2 2 for inti 3...
983 最低票價 動態規劃
在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。火車票有三種不同的銷售方式 一張為期一天的通行證售價為 costs 0 美元 一張為期七天的通行證售價為 costs 1 美元 一張...
Leetcode 動態規劃 983 最低票價
在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。火車票有三種不同的銷售方式 一張為期一天的通行證售價為 costs 0 美元 一張為期七天的通行證售價為 costs 1 美元 一張...