// 扔鸡蛋问题 解析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])}