其他分享
首页 > 其他分享> > leetcode375. 猜数字大小 II(区间dp)

leetcode375. 猜数字大小 II(区间dp)

作者:互联网

链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/

题目

我们正在玩一个猜数游戏,游戏规则如下:

我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

用例

示例 1:

输入:n = 10
输出:16
解释:制胜策略如下:

输入:n = 1
输出:0
解释:只有一个可能的数字,所以你可以直接猜 1 并赢得游戏,无需支付任何费用。
示例 3:

输入:n = 2
输出:1
解释:有两个可能的数字 1 和 2 。

提示:

1 <= n <= 200

思路

标准的区间dp模板题
在区间[i,j]中取得保证获胜最优解情况,选择k属于[i,j],取k + max(f[i][k - 1], f[k + 1][j])的值最小的情况(左右区间子树中取最大代价)

class Solution {
public:
    int getMoneyAmount(int n) {
        vector<vector<int>> f(n+1,vector<int>(n+1));
        for (int i = n - 1; i >= 1; i--) {
            for (int j = i + 1; j <= n; j++) {
                int minCost = INT_MAX;
                for (int k = i; k < j; k++) {
                    int cost = k + max(f[i][k - 1], f[k + 1][j]);
                    minCost = min(minCost, cost);
                }
                f[i][j] = minCost;
            }
        }
        return f[1][n];
    }
};

标签:10,数字,leetcode375,II,总费用,如果,猜测,dp,游戏
来源: https://www.cnblogs.com/kitamu/p/15549274.html