/*
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))
}
动态规划——寻找业务限制的尝试模型
最新推荐文章于 2024-01-28 22:37:20 发布