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]的值就已经变了,所以应该存一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值