375. Guess Number Higher or Lower II

来源:互联网 发布:小程序个人中心源码 编辑:程序博客网 时间:2024/06/09 04:57

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.

Credits:
Special thanks to @agave and @StefanPochmann for adding this problem and creating all test cases.

这道题用动态规划解题。如果x属于(i,j)任意一个数,那么要找最少的消耗,遍历(i,j),动规的条件是dp(i,j) = x + max(dp(i,x-1),dp(x+1,j)),取最小的dp。代码如下:

public class Solution {    public int getMoneyAmount(int n) {        int[][] table = new int[n + 1][n + 1];        return helper(table, 1 , n);    }        private int helper(int[][] t, int s, int e) {        if (s >= e) {            return 0;        }        if (t[s][e] != 0) {            return t[s][e];        }        int res = Integer.MAX_VALUE;        for (int i = s; i <= e; i ++) {            int temp = i + Math.max(helper(t, s, i - 1), helper(t, i + 1, e));            res = Math.min(res, temp);        }        t[s][e] = res;        return res;    }}

0 0