鸡蛋硬度为k,则在第k层及以下摔下去不碎,在第k+1层及以上摔下去会碎掉。

楼层高度为n,鸡蛋个数为m,为了求鸡蛋硬度,

求最坏情况下所需要的扔鸡蛋次数最少的策略。

【动态规划】鸡蛋硬度_最小值

 初始化:

f[1][i]=1,f[i][1]=i

f[i][j]=min(f[i][j-1],max(f[k-1][j-1],f[i-k][j])+1)

因为可以选择第j个鸡蛋用还是不用,所以是可控的,所以两种可以取最小值。

第k层碎不碎是不可选的,考虑最坏情况,所以取最大值

import sys
def dp(n,m):
    N,M=n+1,m+1
    f=[[0]*M for i in range(N)]
    for i in range(1,M):
        f[1][i]=1
    for j in range(1,N):
        f[j][1]=j
    for i in range(2,N):
        for j in range(2,M):
            f[i][j]=f[i][j-1]
            for k in range(1,i+1):
                f[i][j]=min(f[i][j],max(f[k-1][j-1],f[i-k][j])+1)
    print(f[n][m])

lines=sys.stdin.readlines()
for line in lines:
    n,m=map(int,line.split())
    dp(n,m)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.