Interval I¶
Description¶
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to guess which number I picked. Every time you guess wrong, I'll tell you whether the number I picked is higher or lower. However, when you guess a particular number x, and you guess wrong, you pay $x. You win the game when you guess the number I picked.
Question Link¶
https://leetcode.com/problems/guess-number-higher-or-lower-ii/description/
Example I:¶
n = 10, I pick 8.
First round: You guess 5, I tell you that it's higher. You pay $5. Second round: You guess 7, I tell you that it's higher. You pay $7. Third round: You guess 9, I tell you that it's lower. You pay $9.
Game over. 8 is the number I picked.
You end up paying $5 + $7 + $9 = $21.
Questions¶
- LeetCode - 375. Guess Number Higher or Lower II
Transform Function¶
for(int len = 1; len <= n; len++) { for(int i = 1; i + len <= n + 1; i++) { int global_min = Integer.MAX_VALUE; for(int k = i + 1; k < j; k++) { int temp = k + Math.max(dp[i][k - 1], dp[k + 1][j]); global_min = Math.min(global_min, temp); } dp[i][j] = global_min; } } tips: len works from len >= 3, because i ~ (k - 1) and (k + 1) ~ j needs at least 3 interval length
Solution¶
class Solution { public int getMoneyAmount(int n) { int[][] dp = new int[n + 1][n + 1]; for(int len = 1; len <= n; len++) { for(int i = 1; i + len <= n + 1; i++) { int j = i + len - 1; if(i == j){ dp[i][j] = 0; continue; } if(i + 1 == j) { dp[i][j] = i; continue; } int global_min = Integer.MAX_VALUE; for(int k = i + 1; k < j; k++) { int temp = k + Math.max(dp[i][k - 1], dp[k + 1][j]); global_min = Math.min(global_min, temp); } dp[i][j] = global_min; } } return dp[1][n]; } }