1.丢鸡蛋问题,已知K个鸡蛋,N层楼,求投掷鸡蛋最小次数(能够判断鸡蛋摔破的楼层)
若在第i层,有一个鸡蛋时:
1)摔碎:则需尝试投掷 i-1次,即dp[i-1]
2)未摔碎:则需尝试投掷 n-i次,即dp[n-i]
3)则共需max(dp[i-1],dp[n-i]) +1 ,1为本次投掷
若在第i层,有K个鸡蛋时:
1)摔碎:则有K-1个鸡蛋,需尝试投掷 i-1次,即dp[K-1][i-1]
2)未摔碎:则有K个鸡蛋,需尝试投掷 n-i次,即dp[K][n-i]
3)则共需max(dp[K-1][i-1],dp[K-1][n-i])+1 的最小值 ,其中dp[1][i-1]=i-1
2.此时我们采取逆向思路
1.丢鸡蛋问题,已知K个鸡蛋,我们最少需要投掷i次,则我们在那一层?:
1)摔碎:则我们在dp[K-1][i-1]层
2)未摔碎:则我们在dp[K][i-1]层
3)则有,dp[K][i]=dp[K-1][i-1]+dp[K-1][i-1]+1
很显然,第一个鸡蛋要从X层扔下去,如果烂了,还可以用另外一个鸡蛋从第一层向上开始扔。
现在,希望至少 扔鸡蛋 X 次,就可以判断出100层楼。那就假设鸡蛋一直没烂,第一次扔完鸡蛋之后,可以得出楼层 X,然后还有X-1次机会,第二扔完又没烂,然后还有X-2次机会,这样一推理,可以得到的楼层数为: X + (X - 1) + (X - 2) + … + 1 = X(X+1) / 2 >=100,解方程,求出X,即可。感觉这个例子可以帮助理解上面那个公式:dp[m][k] = dp[m - 1][k] + dp[m - 1][k - 1] + 1
class Solution:
def superEggDrop(self, K, N): # 方法1