Memo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public int getMoneyAmount(int n) { Integer[][] memo = new Integer[n + 1][n + 1]; return getMoneyAmount(1, n, memo); }
private int getMoneyAmount(int i, int j, Integer[][] memo) { if (i >= j) { return 0; }
if (memo[i][j] != null) { return memo[i][j]; }
int minCost = Integer.MAX_VALUE; for (int k = i; k <= j; k++) { int answerInLeft = getMoneyAmount(i, k - 1, memo); int answerInRight = getMoneyAmount(k + 1, j, memo); minCost = Math.min(Math.max(answerInLeft, answerInRight) + k, minCost); }
memo[i][j] = minCost; return minCost; } }
|
DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public int getMoneyAmount(int n) { int[][] dp = new int[n + 2][n + 2];
for (int i = n; i >= 1; i--) { for (int j = i + 1; j <= n; j++) { int min = Integer.MAX_VALUE; for (int k = i; k <= j; k++) { min = Math.min(min, Math.max(dp[i][k - 1], dp[k + 1][j]) + k); } dp[i][j] = min; } }
return dp[1][n]; } }
|
References
375. Guess Number Higher or Lower II