python面試積累: 貝殼找房“採木頭,鋸子、斧頭”問題

鋸子和斧頭輪流砍樹問題: 第一行輸入樹的個數 n, 接下來的 n 行,每行分別輸入三個數 a、b、c,分別代表用鋸子和斧頭砍該棵樹的時間,以及換工具砍樹所需要的時間。現在手上是斧頭,問看完這些樹,最短需要多長時間。
輸入:
3
20 40 20
10 4 25
90 100 5
輸出:139
Explanation:第一棵樹用斧頭砍(40),第二顆樹還用斧頭(4),第三棵樹,換成鋸子(5 + 90)

解決辦法

做積累,同學給我講的,原文c++版本見LeetCode - 120. Triangle、貝殼找房“採木頭,橘子斧頭”問題 - 簡單DP這道題是貪心,即

dp[0]=min(dp[0],dp[1]+b+c) +a
dp[1]=min(dp[1],dp[0]+a+c)+b

其中,dp[0]是鋸子,dp[1]是斧頭,a、b、c分別是當前回合,鋸子所用的時間、斧子所用的時間、切換工具所用的時間。

def main():
	n=list(map(int,input().split(" ")))        # 取到”樹的棵數“  ,在例子中就是 3
	abc=list(map(int,input().split(" ")))
	dp=[abc[0]+abc[2], abc[1]]               # dp[0]: 鋸子   dp[1]:斧頭, 手裏拿着的是斧頭,所以dp[0]初始化+c
	for i in range(1,n):
		abc=list(map(int,input().split(" ")))
		dp0=dp[0]
		dp[0]=min(dp[0], dp[1]+abc[2])+abc[0]
		dp[1]=min(dp[1], dp0+abc[2])+abc[1]
	print(min(dp[0],dp[1]))

注意問題

只過了9%

當時只過了9%,還沒發現問題。
是因爲

	for i in range(1,n):
		abc=list(map(int,input().split(" ")))
		dp[0]=min(dp[0], dp[1]+abc[2])+abc[0]
		dp[1]=min(dp[1], dp[0]+abc[2])+abc[1]

最開始是這麼寫的,但是其實在計算dp[1]的時候,dp[0]的值就已經變了,所以應該存一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章