我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字,就会 赢得游戏 。如果你猜错了,那么我会告诉你,我选的数字比你的 更大或

 class Solution 

 {

 public:

     int getMoneyAmount(int n) 

     {

         int dp[n + 1][n + 1];

         memset(dp, 0x3f, sizeof dp);

         for (int i = 0; i <= n; i++)

             dp[i][i] = 0;

         for (int i = n - 1; i >= 1; i--)

         {

             for (int j = i + 1; j <= n; j++)

             {

                 for (int k = i; k <= j; k++)

                 {

                     dp[i][j] = min(dp[i][j], k + 

                                    max(i > k - 1 ? 0 : dp[i][k - 1], 

                                        k + 1 > j ? 0 : dp[k + 1][j]));

                 }

             }

         }

         return dp[1][n];

     }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个经典的猜数游戏,可以使用动态规划来解决。我们可以定义一个二维数组 dp,其中 dp[i][j] 表示在数字范围 [i, j] 内数能够确保获胜的最小现金数。 首先,当 i = j 时,只有一个数字可供选择,不需要测,所以 dp[i][j] = 0。 其次,当 i < j 时,我们可以尝试每个可能的数字 x,其中 i ≤ x ≤ j,并计算在选择数字 x 后,所需支付的现金数以及在剩余数字范围内测能够确保获胜的最小现金数。我们需要选择其中的最大值作为 dp[i][j] 的值。 具体而言,对于每个可能的数字 x,我们需要计算在选择数字 x 后所需支付的现金数。如果选择数字 x,那么有两种情况: 1. 如果 x 是正确的答案,那么我们赢得游戏,所需支付的现金数为 0; 2. 如果 x 不是正确的答案,我们需要继续测。根据题目规则,我们可以得知正确答案在范围 [i, j] 内,因此我们需要支付 x 的现金数,并且还需要考虑在剩余数字范围内测能够确保获胜的最小现金数,即 dp[i][x-1] 和 dp[x+1][j] 中的较大值。 综上所述,我们可以得到状态转移方程: dp[i][j] = min(max(dp[i][x-1], dp[x+1][j]) + x),其中 i ≤ x ≤ j。 根据这个状态转移方程,我们可以使用动态规划的方法从小到大计算 dp 数组的值。最终,dp[1][n] 即为能够确保获胜的最小现金数。 以下是使用 Python 实现的代码: ```python def getMoneyAmount(n): dp = [[0] * (n + 1) for _ in range(n + 1)] for i in range(n, 0, -1): for j in range(i + 1, n + 1): dp[i][j] = float('inf') for k in range(i, j): dp[i][j] = min(dp[i][j], max(dp[i][k - 1], dp[k + 1][j]) + k) return dp[1][n] ``` 对于给定的 n=20,调用函数 `getMoneyAmount(20)` 将返回能够确保获胜的最小现金数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值