锯子和斧头轮流砍树问题: 第一行输入树的个数 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]的值就已经变了,所以应该存一下。