扔鸡蛋
2021-12-23 本文已影响0人
wncbbnk
扔鸡蛋,有egg个鸡蛋,楼高度为floor层。
问,至少扔几次,才能确定鸡蛋最多在哪一层,不碎
package main
import (
"fmt"
"math"
)
func getMinFloorNumber(floor, egg int) int {
dp := make([][]int, floor+1)
for i := 0; i < floor+1; i++ {
dp[i] = make([]int, egg+1)
}
for i := 0; i < floor+1; i++ {
for j := 0; j < egg+1; j++ {
dp[i][j] = math.MaxInt32
}
}
// i层楼,1个鸡蛋,必须都遍历一遍
for i := 1; i < floor+1; i++ {
dp[i][1] = i
}
for i := 1; i < egg+1; i++ {
// 0层楼,不需要扔
dp[0][i] = 0
// 1层楼,需要扔一次
dp[1][i] = 1
}
for i := 2; i < floor+1; i++ {
for j := 2; j < egg+1; j++ {
for k := 1; k <= i; k++ {
// 从1层到k层挨个试验
// 分为两种情况,要么蛋碎了,要么蛋没碎
// 1.蛋碎了, 说明k层以及大于k层不用测了,
// 还需要测k-1层, 且只剩j-1个蛋
// 2.蛋没碎,说明k层以及小于k层不用测了,
// 还需要测i-k层,且蛋还是j个
// 无论如何都摔了一次,因此要加一
// 因为1~k层,蛋碎,都有可能,因此需要取最大值
tmp := max(dp[k-1][j-1], dp[i-k][j]) + 1
// 因为可以从1~i层扔,每次只能选一种情况,因此选择最小值
// 这里取所有方法的最小值
dp[i][j] = min(tmp, dp[i][j])
}
}
}
return dp[floor][egg]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
fmt.Printf("rst:%d\n", getMinFloorNumber(100, 2))
}
``