动态规划——寻找业务限制的尝试模型

/*
4. 寻找业务限制的尝试模型
题目 六
给定一个数组,代表每个人喝完咖啡准备刷杯子的时间
只有一台咖啡机,一次只能洗一个杯子,时间消耗a,洗完才能洗下一杯
每个咖啡杯也可以自己挥发干净,时间耗费b,咖啡杯可以并行挥发
返回让所有咖啡杯变干净的最早完成时间
数组是有序的
三个参数: int[] arr, int a, int b
 */

/*
a 洗一杯的时间 固定变量
b 自己挥发干净的时间,固定变量
drinks 每一个员工喝完的时间 固定变量
drinks[index...] 都想变干净,这是我操心的,washLine表示洗的机器合适可用
drinks[index...] 变干净,最少的时间点返回
 */


func processDrinks(drinks []int,a, b, index, washLine int) int {
	if index == len(drinks) - 1 {
		return Min(
			Max(washLine,drinks[index] ) + a,
			drinks[index] + b)
	}
	//剩余不只一杯咖啡
	wash := Max(washLine, drinks[index]) + a
	next1 := processDrinks(drinks, a, b, index + 1, wash)
	p1 := Max(wash,next1)

	dry := drinks[index] + b
	next2 := processDrinks(drinks, a, b,index+1, washLine)
	p2 := Max(dry,next2)
	return Min(p1, p2)
}


func DrinksDp(drinks []int,a, b int) int {
	if a > b {
		return drinks[len(drinks)] +1
	}

	N := len(drinks)
	limit := 0 //咖啡机什么时候可用
	for i := 0; i < N; i++ {
		limit = Max(limit, drinks[i]) + a
	}

	dp := make([][]int,N)
	for k := range dp {
		dp[k] = make([]int,limit + 1)
	}

	for washLine := 0; washLine <= limit; washLine++ {
		dp[N-1][washLine] = Min(
			Max(washLine,drinks[N-1]) + a,
			drinks[N-1] + b,
			)
	}

	for index := N -2 ; index >= 0; index-- {

		for washLine := 0; washLine <= limit; washLine++ {
			p1 := math.MaxInt
			wash := Max(washLine, drinks[index]) + a
			if wash <= limit {
				p1 = Max(wash, dp[index+1][wash])
			}

			p2 := Max(drinks[index]+b,dp[index+1][washLine])
			dp[index][washLine] = Min(p1,p2)
		}
	}

	return dp[0][0]
}

func TestDrink(t *testing.T)  {
	arr := []int{1,1,5,5,7,10,12,12,12,12,12,12,15}
	a, b := 3, 10
	fmt.Println(processDrinks(arr,a,b,0,0))
	fmt.Println(DrinksDp(arr,a,b))
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值