[关闭]
@DingCao-HJJ 2015-10-19T20:59:41.000000Z 字数 1730 阅读 1291

URAL_1223 Chernobyl’ Eagle on a Roof

URAL 动态规划


题目链接

题目大意

给定比较硬的鹰蛋个数eggs, 和楼层数floors,问最差情况下的实验次数为多少时,才能确定蛋刚好不破裂的那一层?

思路[1]

建立动态规划函数g(trail, eggs), 表示eggs个蛋实验trail次最差情况下能确定最大的层数。
明显,只给一个蛋的时候只能逐层往上实验,g(trail, 1) = trail;
只实验一次只能确定一层,g(1, eggs) = 1

那么,进行一次实验,情况有二:
蛋碎了,用剩下的eggs-1个蛋进行剩下的trial-1次实验能最高层数为g(trial-1, eggs-1);
蛋没碎,用eggs个蛋进行剩下的trial-1次实验能最高层数为g(trial-1, eggs);

g(trial, eggs) = g(trial-1, eggs-1) + g(trial-1, eggs) + 1.

代码

  1. // Copyright (c) 2015 HuangJunjie@SYSU(SNO:13331087). All Rights Reserved.
  2. #include <cstdio>
  3. #define MAX 1000
  4. int g(int eggs, int floors);
  5. int main() {
  6. int eggs, floors;
  7. while (scanf("%d %d", &eggs, &floors) != EOF && (eggs && floors)) {
  8. printf("%d\n", g(eggs, floors));
  9. }
  10. return 0;
  11. }
  12. int g(int eggs, int floors) {
  13. int matrix[MAX + 5][MAX + 5] = { 0 };
  14. for (int i = 0; i <= MAX; i++) {
  15. matrix[1][i] = 1;
  16. matrix[i][1] = i;
  17. }
  18. if (eggs == 1) return floors;
  19. if (floors == 1) return 1;
  20. for (int trial = 1; trial <= floors; trial++) {
  21. for (int egg = 1; egg <= eggs; egg++) {
  22. if (trial > 1 && egg > 1) {
  23. matrix[trial][egg] = matrix[trial - 1][egg - 1] + matrix[trial - 1][egg] + 1;
  24. if (matrix[trial][egg] >= floors && matrix[trial-1][egg] < floors)
  25. return trial;
  26. }
  27. }
  28. }
  29. }

优化

数据规模不大,源代码重复建表,但是这个表只是不同的数据组合搜索出来的位置不同,表格内容是完全一样的, 故将建表操作放在搜索结果前面。

  1. // Copyright (c) 2015 HuangJunjie@SYSU(SNO:13331087). All Rights Reserved.
  2. #include <cstdio>
  3. #define MAX 1000
  4. int g(int eggs, int floors);
  5. int main() {
  6. int eggs, floors;
  7. while (scanf("%d %d", &eggs, &floors) != EOF && (eggs && floors)) {
  8. printf("%d\n", g(eggs, floors));
  9. }
  10. return 0;
  11. }
  12. int g(int eggs, int floors) {
  13. int matrix[MAX + 5][MAX + 5] = { 0 };
  14. for (int i = 0; i <= MAX; i++) {
  15. matrix[1][i] = 1;
  16. matrix[i][1] = i;
  17. }
  18. if (eggs == 1) return floors;
  19. if (floors == 1) return 1;
  20. for (int trial = 1; trial <= floors; trial++) {
  21. for (int egg = 1; egg <= eggs; egg++) {
  22. if (trial > 1 && egg > 1) {
  23. matrix[trial][egg] = matrix[trial - 1][egg - 1] + matrix[trial - 1][egg] + 1;
  24. if (matrix[trial][egg] >= floors && matrix[trial-1][egg] < floors)
  25. return trial;
  26. }
  27. }
  28. }
  29. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注