leetcode 174. Dungeon Game | 174. 地下城游戏(暴力递归->傻缓存->dp)

男娘i 2022-09-14 09:07 199阅读 0赞

题目

https://leetcode.com/problems/dungeon-game/
在这里插入图片描述

题解

方法1:4个参数的递归+缓存,TLE

今日结论:转换成dp之前,递归的参数设计很重要,参数越少越好

我第一版递归有4个参数,心想,加个缓存吧,当我写出4个map嵌套的时候,内心是绝望的。。
在这里插入图片描述

方法2:两个参数的dp

方法 1 超时,于是看了答案的递归版本:
https://leetcode.com/problems/dungeon-game/discuss/745340/post-Dedicated-to-beginners-of-DP-or-have-no-clue-how-to-start

然后用 暴力递归->傻缓存->dp 的套路,转化成的自底向上的 dp。

  1. class Solution {
  2. int M, N;
  3. public int calculateMinimumHP(int[][] dungeon) {
  4. M = dungeon.length;
  5. N = dungeon[0].length;
  6. int[][] dp = new int[M + 1][N + 1];
  7. // 【Solution 1】傻缓存
  8. // return process(0, 0, dungeon, dp);
  9. // 【Solution 2】dp
  10. for (int i = 0; i <= M; i++) {
  11. dp[i][N] = Integer.MAX_VALUE;
  12. }
  13. for (int i = 0; i <= N; i++) {
  14. dp[M][i] = Integer.MAX_VALUE;
  15. }
  16. dp[M - 1][N - 1] = dungeon[M - 1][N - 1] > 0 ? 1 : 1 - dungeon[M - 1][N - 1];
  17. for (int i = M - 1; i >= 0; i--) {
  18. for (int j = N - 1; j >= 0; j--) {
  19. if (i == M - 1 && j == N - 1) continue;
  20. int p1 = dp[i + 1][j];
  21. int p2 = dp[i][j + 1];
  22. int minReq = Math.min(p1, p2) - dungeon[i][j];
  23. dp[i][j] = minReq <= 0 ? 1 : minReq;
  24. }
  25. }
  26. return dp[0][0];
  27. }
  28. // return min requirement
  29. // public int process(int i, int j, int[][] dungeon, int[][] dp) {
  30. // if (i == M || j == N) return Integer.MAX_VALUE;
  31. // if (dp[i][j] != 0) return dp[i][j];
  32. // if (i == M - 1 && j == N - 1) {
  33. // return dungeon[i][j] > 0 ? 1 : 1 - dungeon[i][j];
  34. // } else {
  35. // int p1 = process(i + 1, j, dungeon, dp);
  36. // int p2 = process(i, j + 1, dungeon, dp);
  37. // int minReq = Math.min(p1, p2) - dungeon[i][j];
  38. // dp[i][j] = minReq <= 0 ? 1 : minReq;
  39. // return dp[i][j];
  40. // }
  41. // }
  42. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,199人围观)

还没有评论,来说两句吧...

相关阅读

    相关 174. 地下游戏

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔