[LeetCode] 375. Guess Number Higher or Lower II @ python

本文介绍了一种猜数游戏的策略,通过动态规划算法计算确保获胜所需的最少现金。对于给定范围内的数字,玩家需猜中目标数字,每猜错一次需支付相应现金。文章详细解释了动态规划的应用,提供了Python代码实现。

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

一.题目:
我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字。每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。
最终的问题:给定一个 n ≥ 1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。

二.解题思路:
题目不是很好理解,这里其实是动态规划的问题.具体解题思路见这篇博客
简单的说,我们需要构造一个动态规划的问题,dp[i][j]表示对于[j…i]这段序列至少需要的金钱用来保证赢得这个游戏.代码如下:

class Solution(object):
    def getMoneyAmount(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [[0] *(n+1) for i in range(n+1)]
        for i in range(1,n+1):
            for j in range(i-1,0,-1):
                cost = n*n
                #当[j...i]序列只有两个元素或者只有三个元素的时候,选择i前面的那个数
                if i-j == 1 or i-j == 2:
                    cost = i-1
                else:
                    #当[j...i]序列序列长度大于3时需要用到动态规划了
                    for k in range(j+1,i):
                        cost = min(cost,k+max(dp[k-1][j],dp[i][k+1]))
                dp[i][j] = cost
        return dp[n][1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值