力扣 動態規劃 最低票價

2021-09-13 01:58:12 字數 3275 閱讀 5452

問題描述

在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 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]

輸出:11

解釋:例如,這裡有一種購買通行證的方法,可以讓你完成你的旅行計畫:

在第 1 天,你花了 costs[0] = $2 買了一張為期 1 天的通行證,它將在第 1 天生效。

在第 3 天,你花了 costs[1] = $7 買了一張為期 7 天的通行證,它將在第 3, 4, …, 9 天生效。

在第 20 天,你花了 costs[0] = $2 買了一張為期 1 天的通行證,它將在第 20 天生效。

你總共花了 $11,並完成了你計畫的每一天旅行。

示例2:

輸入: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 code
class

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 美元 一張...