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 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 7 + 21.
Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.

分析
这个题目,理解题目问什么比较tricky。。

大意如下
给你n个数字(1 2 3 4 .... n)

answer = min_maxcost = No matter what the target is, the min_maxcost can cover the cost of guessing it from the n numbers.

but you would ask, then why not just return sum of (1...n)?

well, we are looking for the minimum one, and so min_maxcost is the lower bound for all such cost

答案

    public int getMoneyAmount(int n) {
        int[][] dp = new int[n + 1][n + 1];
        for(int i = 0; i < dp.length; i++)
            Arrays.fill(dp[i], -1);

        return recur(dp, 1, n);
    }

    public int recur(int[][] dp, int left, int right) {
        if(left >= right) return 0;
        if(dp[left][right] !=  -1) return dp[left][right];
        // No cost for guessing a number in range of size 1, it has to be correct


        int min = Integer.MAX_VALUE;
        for(int i = left; i <= right; i++) {
            min = Math.min(min, i + Math.max(recur(dp, left, i - 1), recur(dp, i + 1, right)));
        }
        dp[left][right] = min;
        return dp[left][right];
    }

你可能感兴趣的:(Guess Number Higher or Lower II)