375. Guess Number Higher or Lower II
发布日期:2025-06-19 14:53:00 浏览次数:3 分类:精选文章

本文共 1113 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要找到在猜数字游戏中确保胜利所需的最小金额。每次猜测错误时,玩家会支付猜测的数字。目标是通过优化猜测策略,尽可能减少支付的总金额。

方法思路

我们可以使用动态规划来解决这个问题。定义 dp[i][j] 表示在区间 [i, j] 中,玩家需要支付的最小金额。我们从较小的区间开始,逐步计算到较大的区间。

  • 初始化:当区间长度为 1 时,玩家直接猜中,不需要支付,所以 dp[i][i] = 0
  • 递推关系:对于区间 [i, j],选择中间的数 mid 作为猜测点。支付 mid 后,进入左右子区间 [i, mid-1][mid+1, j],选择支付较少的方案。因此,递推公式为:[dp[i][j] = mid + \min(dp[i][mid-1], dp[mid+1][j])]其中 mid = (i + j) / 2
  • 解决代码

    public class Solution {    public int getMoneyAmount(int n) {        if (n == 1) return 0;        if (n == 2) return 1;        int[] dp = new int[n + 1];        for (int i = 1; i <= n; i++) {            dp[i] = i;        }        for (int length = 3; length <= n; length++) {            for (int i = 1; i <= n - length + 1; i++) {                int j = i + length - 1;                int mid = (i + j) / 2;                dp[i][j] = mid + Math.min(dp[i][mid - 1], dp[mid + 1][j]);            }        }        return dp[1][n];    }}

    代码解释

  • 初始化:创建一个数组 dp,其中 dp[i] 表示区间 [i, i] 的支付金额,初始值为 i
  • 递推计算:从长度 3 到 n,计算每个区间 [i, j] 的最小支付金额。选择中间的数 mid,并计算左右子区间的最小值,更新 dp[i][j]
  • 返回结果dp[1][n] 表示整个区间 [1, n] 的最小支付金额。
  • 通过这种动态规划的方法,我们可以高效地计算出确保胜利所需的最小金额。

    上一篇:3D Button API
    下一篇:360广告拦截导致页面不显示

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年06月05日 04时07分42秒