1. // 扔鸡蛋问题 解析
    2. func main(){
    3. floors := 100
    4. eggs := 2
    5. dp := [3][101]int {}
    6. // 外面这两层循环(循环鸡蛋数量和楼层数量)是为了将dp二维数组的每一个值遍历到
    7. for egg:=1; egg < eggs+1; egg++ {
    8. for floor:=1; floor < floors + 1; floor++ {
    9. // 解决这样的干扰非常有必要,把底层边界进行固定,最大程度防止 0, 1的错误
    10. // 这步判断是解决掉 最初状态的干扰,鸡蛋只有一个
    11. if egg == 1{
    12. dp[1][floor] = floor
    13. continue
    14. }
    15. // 这两部判断是解决掉 最初状态的干扰,只有一层楼的状态
    16. if floor == 1{
    17. dp[egg][1] = 1
    18. continue
    19. }
    20. tmpMin := floors
    21. // 这一层遍历是进行状态转移核心,限定了当前的 egg和floor时
    22. // 通过遍历当前floor 之前的已知解,从中取出最优方案
    23. for sonFloor:=1; sonFloor < floor; sonFloor++ {
    24. tmpMax := 0
    25. // dp[egg][floor-sonFloor] 鸡蛋没碎,考虑剩下几层楼所需要的最优解
    26. //
    27. if dp[egg][floor-sonFloor] <= dp[egg-1][sonFloor-1] {
    28. tmpMax = dp[egg-1][sonFloor-1] + 1
    29. } else {
    30. tmpMax = dp[egg][floor-sonFloor] + 1
    31. }
    32. if tmpMax < tmpMin {
    33. tmpMin = tmpMax
    34. }
    35. }
    36. dp[egg][floor] = tmpMin
    37. }
    38. }
    39. fmt.Println(dp)
    40. fmt.Println(dp[eggs][floors])
    41. }