标签:wrong turn post ima value 努力 str instead pre
原题链接在这里:https://leetcode.com/problems/guess-number-higher-or-lower-ii/
题目:
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.
Example:
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.
Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.
Hint:
题解:
是Guess Number Higher or Lower的进阶题.
DP题. e.g. n = 6, 第一次猜3, 如果猜大了,那接下来要求的是从 [1, 2] 中猜到正确数字所需要花费的最少money, 记为x. 如果猜的小了,那么我们接下去要求的是从 [4, 6] 中猜到正确数字所需要花费的最少 money, 记为 y. 如果刚好猜中,则结束。
很显然,如果第一把猜 3, 那么猜中数字至少需要花费的 money 为 3+ max(x, y). 至少需要的话费就是 做最坏的打算,尽最大努力,取最大值. 这是第一次取3的情况,还有5中情况. 取1~n所有情况下的最小值就是最小化将面临的可能的最大损失.
len是取出一段的长度. start是一段的开始.
Time Complexity: O(n^3). Space: O(n^2).
AC Java:
1 public class Solution { 2 public int getMoneyAmount(int n) { 3 int [][] dp = new int[n+1][n+1]; 4 for(int len = 2; len<=n; len++){ 5 for(int start = 1; start<=n-len+1; start++){ 6 int minPay = Integer.MAX_VALUE; 7 for(int pivot = start; pivot < start+len-1; pivot++){ 8 int temp = pivot + Math.max(dp[start][pivot-1], dp[pivot+1][start+len-1]); 9 minPay = Math.min(minPay, temp); 10 } 11 dp[start][start+len-1] = minPay; 12 } 13 } 14 return dp[1][n]; 15 } 16 }
Reference: Minimax,
http://www.cnblogs.com/zichi/p/5701194.html
LeetCode Guess Number Higher or Lower II
标签:wrong turn post ima value 努力 str instead pre
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/6353630.html