一.题目:
我们正在玩一个猜数游戏,游戏规则如下:
我从 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]