鋸子和斧頭輪流砍樹問題: 第一行輸入樹的個數 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]的值就已經變了,所以應該存一下。