国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

375. Guess Number Higher or Lower II -Medium

2019-11-14 08:52:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

A# Question

We are playing the Guess Game. The game is as follows:

I pick a number from 1 to n. You have to guess which number I picked.

Every time you guess wrong, I’ll tell you whether the number I picked is higher or lower.

However, when you guess a particular number x, and you guess wrong, you pay $x. You win the game when you guess the number I picked.

Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.

猜數(shù)字游戲,A在1-n中選擇一個(gè)數(shù)字,當(dāng)B猜中A選擇的數(shù)字,B就贏得比賽。每當(dāng)B猜錯(cuò),A會(huì)告訴B是否太大還是太小,同時(shí)B要給A對(duì)應(yīng)猜的數(shù)字的錢。現(xiàn)在給出n,請(qǐng)你找出你保證贏得比賽所需花費(fèi)的最少的錢

Example

n = 10, I pick 8.

First round: You guess 5, I tell you that it’s higher. You pay $5. Second round: You guess 7, I tell you that it’s higher. You pay $7. Third round: You guess 9, I tell you that it’s lower. You pay $9.

Game over. 8 is the number I picked.

You end up paying 5 + 7 + 9 = 21.

這里的例子給出的21只是一種猜測(cè)情況所需的花費(fèi),而不是題目的答案

Solution

這道題可以用dp求解。題目求的是保證贏得比賽所需花費(fèi)的最少的,即最壞的情況下,最少需要花多少錢保證贏得比賽。因?yàn)锳會(huì)在1-n中任意選擇一個(gè)數(shù)字x,而B直到猜到數(shù)字x時(shí)會(huì)有一個(gè)最大花費(fèi),那么我們只需求得到底A選擇哪個(gè)數(shù)字時(shí)B猜測(cè)的最大花費(fèi)最小,這樣當(dāng)A選該數(shù)字時(shí),B總能保證在小于K的花費(fèi)下獲勝。(這里的最大花費(fèi)指在策略最優(yōu),運(yùn)氣最差的情況下的花費(fèi))

根據(jù)上面的思路,我們定義dp[i][j]:在[i, j]范圍中保證贏得游戲所需花費(fèi)最少的錢。因?yàn)槭亲顗牡那闆r,所以在策略最優(yōu)的情況下,B始終不會(huì)猜中數(shù)字,那么當(dāng)B猜數(shù)字x的情況下,子問(wèn)題將會(huì)出現(xiàn)兩種情況“猜的數(shù)字過(guò)小”,“猜的數(shù)字過(guò)大”,我們只需要比較出花費(fèi)較多的情況即可,所以B猜數(shù)字x的最大花費(fèi)為:B_Choose_X = x + max(dp[i][x - 1], dp[x + 1][j]),在得到A選擇任意x,B所需的最大花費(fèi)時(shí),dp[i][j] = min{B_Choose_1, B_Choose_2, …, B_Choose_N}

class Solution(object): def getMoneyAmount(self, n): """ :type n: int :rtype: int """ self.dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)] return self.solve(1, n) def solve(self, s, e): # 保存dp中間變量,減少重復(fù)計(jì)算 if self.dp[s][e] != 0: return self.dp[s][e] # 如果只有一個(gè)數(shù)字可以選擇,那么B肯定能猜中,不需要花費(fèi)錢 if s >= e: return 0 min_cost = float('inf') # 計(jì)算A選擇任一數(shù)字,B所需的最多的錢 for x in range(s, e): max_cost = x + max(self.solve(s, x - 1), self.solve(x + 1, e)) if min_cost > max_cost: min_cost = max_cost # 取所需最少的錢的情況 self.dp[s][e] = min_cost return self.dp[s][e]
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永登县| 尉犁县| 白朗县| 新宾| 苏州市| 连江县| 苍南县| 呈贡县| 论坛| 双流县| 孝感市| 富宁县| 嘉兴市| 襄垣县| 海淀区| 德昌县| 郁南县| 宝应县| 密山市| 内丘县| 岑巩县| 屏南县| 白沙| 临颍县| 宁夏| 容城县| 榕江县| 龙胜| 文水县| 星子县| 黔西县| 达尔| 六枝特区| 曲麻莱县| SHOW| 即墨市| 屏东市| 柘城县| 清涧县| 隆德县| 东平县|