There is a building of n
floors. If an egg drops from the k
th floor or above, it will break. If it‘s dropped from any floor below, it will not break.
You‘re given m
eggs, Find k while minimize the number of drops for the worst case. Return the number of drops in the worst case.
Example
Given m
= 2
, n
= 100
return 14
Given m
= 2
, n
= 36
return 8
动态规划+递归。用二元数组存储某鸡蛋某层所需的次数。迭代试扔第一个鸡蛋,在某层扔。1.扔碎了即转为鸡蛋少一个,楼层少一层的子问题。2.没扔碎即转化为鸡蛋没有少楼层少为上半层那么多的子问题。
思维方式见:http://datagenetics.com/blog/july22012/index.html的“Look see I can do three”
public class Solution { /* * @param m: the number of eggs * @param n: the number of floors * @return: the number of drops in the worst case */ public int dropEggs2(int m, int n) { // write your code here int[][] dp = new int[m + 1][n + 1]; for (int i = 1; i <= m; i++){ dp[i][0] = 0; dp[i][1] = 1; } for (int j = 1; j <= n; j++){ dp[1][j] = j; } for (int i = 2; i <= m; i++){ for (int j = 2; j <= n; j++){ dp[i][j] = Integer.MAX_VALUE; for(int k = 1; k < j; k++){ dp[i][j] = Math.min(dp[i][j], 1 + Math.max(dp[i - 1][k - 1], dp[i][j - k])); } } } return dp[m][n]; } }
时间: 2024-10-24 00:56:59