f(x)=max(x, f(N-x)+1)
[size=1em]1 [size=1em]2 [size=1em]3 [size=1em]4 [size=1em]5 [size=1em]6 [size=1em]7 [size=1em]8 [size=1em]9 [size=1em]10 [size=1em]11 [size=1em]12 [size=1em]13 [size=1em]14 [size=1em]15 [size=1em]16 [size=1em]17 [size=1em]18 [size=1em]19 [size=1em]20 [size=1em]21 [size=1em]22 [size=1em]23 [size=1em]24 [size=1em]25 [size=1em]26 [size=1em]27 [size=1em]28 [size=1em]29 [size=1em]30 [size=1em]31 [size=1em]32 [size=1em]33 | [size=1em][size=1em]// times表示N取值为i的时候,需要扔多少次 [size=1em]private static int[] times; [size=1em]public static int dropEgg(int N) { [size=1em] // 初始化数组 [size=1em] times = new int[N + 1]; [size=1em] return dp(N); [size=1em]} [size=1em]private static int dp(int N) { [size=1em] // 两层楼或一层楼就没有计算的必要了 [size=1em] if (1 == N) [size=1em] return 1; [size=1em] else if (2 == N) [size=1em] return 2; [size=1em] for (int x = 2; x < N; x++) { [size=1em] int max = maxTimes(N, x); [size=1em] if (0 == times[N] || times[N] > max) [size=1em] times[N] = max; [size=1em] } [size=1em] return times[N]; [size=1em]} [size=1em]// 碎和不碎的次数最大值 [size=1em]private static int maxTimes(int N, int x) { [size=1em] int sum = dp(N - x) + 1; [size=1em] if (x < sum) [size=1em] return sum; [size=1em] else [size=1em] return x; [size=1em]} |
[size=1em]1 [size=1em]2 [size=1em]3 [size=1em]4 [size=1em]5 [size=1em]6 [size=1em]7 [size=1em]8 [size=1em]9 [size=1em]10 [size=1em]11 [size=1em]12 [size=1em]13 [size=1em]14 [size=1em]15 [size=1em]16 [size=1em]17 [size=1em]18 [size=1em]19 [size=1em]20 [size=1em]21 [size=1em]22 [size=1em]23 [size=1em]24 [size=1em]25 [size=1em]26 [size=1em]27 [size=1em]28 | [size=1em][size=1em]public static int dropEgg(int N, int m) { [size=1em] // 初始化数组 [size=1em] times = new int[m + 1][N + 1]; [size=1em] return dp(N, m); [size=1em]} [size=1em]private static int dp(int N, int m) { [size=1em] if (1 == m || 1 == N || 2 == N) [size=1em] return N; [size=1em] for (int time = 2; time <= m; time++) [size=1em] for (int x = 2; x < N; x++) { [size=1em] int max = maxTimes(N, x, time); [size=1em] if (0 == times[time][N] || times[time][N] > max) [size=1em] times[time][N] = max; [size=1em] } [size=1em] return times[m][N]; [size=1em]} [size=1em]// 碎和不碎的次数最大值 [size=1em]private static int maxTimes(int N, int x, int m) { [size=1em] int sum = dp(N - x, m) + 1; [size=1em] if (x < sum) [size=1em] return sum; [size=1em] else [size=1em] return x; [size=1em]} |
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |