leetcode-------375. 猜数字大小 II (区间DP)[1]

本文探讨了一个猜数字游戏的最优策略,通过动态规划算法计算确保获胜所需的最少现金。游戏中,玩家需根据提示猜中1到n之间的数字,每猜错一次需支付相应现金。文章详细解释了如何通过动态规划求解此问题,并提供了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

我从 到 n 之间选择一个数字,你来猜我选了哪个数字。

每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。

然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。

示例:n = 10, 我选择了8. 第一轮: 你猜我选择的数字是5,我会告诉你,我的数字更大一些,然后你需要支付5块。 第二轮: 你猜是7,我告诉你,我的数字更大一些,你支付7块。 第三轮: 你猜是9,我告诉你,我的数字更小一些,你支付9块。 游戏结束。8 就是我选的数字。 你最终要支付 5 + 7 + 9 = 21 块钱。

给定 n ≥ 1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。

分析:求至少拥有多少现金才能确保赢得这个游戏。也就是求最坏的情况下需要最少多少钱。动态规划。 
具体是这样的,在1-n个数里面,我们任意猜一个数(设为k),保证获胜所花的钱应该为 k+ max(dp(1 ,k-1), dp(k+1 ,n)),这里dp(x,y))表示猜范围在(x,y)的数保证能赢应花的钱,则我们依次遍历 1-n作为猜的数,求出其中的最小值即为答案,即最小的最大值问题。 
 

class Solution {
    public:

        int getMoneyAmount(int n) {

            vector<vector<int> > dp(n+1,vector<int>(n+1));
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                {
                    dp[i][j]=-1;
                    if(j==i) dp[i][j]=0;
                    if(j==i+1) dp[i][j]=i;
                }

            cout<<DP(1,n,dp)<<endl;
            return   DP(1,n,dp);
        }

        int  DP(int i,int j,vector<vector<int> > &dp)
        {
            if(dp[i][j]>=0) return dp[i][j];
            int imin=10000,t;
            for(int k=i+1; k<j; k++)
            {
                t=max(DP(i,k-1,dp),DP(k+1,j,dp))+k;
                imin=min(imin,t);
            }
            return dp[i][j]=imin;
        }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值