// 扔鸡蛋问题 解析
func main(){
floors := 100
eggs := 2
dp := [3][101]int {}
// 外面这两层循环(循环鸡蛋数量和楼层数量)是为了将dp二维数组的每一个值遍历到
for egg:=1; egg < eggs+1; egg++ {
for floor:=1; floor < floors + 1; floor++ {
// 解决这样的干扰非常有必要,把底层边界进行固定,最大程度防止 0, 1的错误
// 这步判断是解决掉 最初状态的干扰,鸡蛋只有一个
if egg == 1{
dp[1][floor] = floor
continue
}
// 这两部判断是解决掉 最初状态的干扰,只有一层楼的状态
if floor == 1{
dp[egg][1] = 1
continue
}
tmpMin := floors
// 这一层遍历是进行状态转移核心,限定了当前的 egg和floor时
// 通过遍历当前floor 之前的已知解,从中取出最优方案
for sonFloor:=1; sonFloor < floor; sonFloor++ {
tmpMax := 0
// dp[egg][floor-sonFloor] 鸡蛋没碎,考虑剩下几层楼所需要的最优解
//
if dp[egg][floor-sonFloor] <= dp[egg-1][sonFloor-1] {
tmpMax = dp[egg-1][sonFloor-1] + 1
} else {
tmpMax = dp[egg][floor-sonFloor] + 1
}
if tmpMax < tmpMin {
tmpMin = tmpMax
}
}
dp[egg][floor] = tmpMin
}
}
fmt.Println(dp)
fmt.Println(dp[eggs][floors])
}