摘要:猜對(duì)則本次猜測(cè)免費(fèi),猜錯(cuò)則本次猜測(cè)需要花費(fèi)和數(shù)字等額的金錢。其實(shí)這題的英文表述有些問題,確切來說,在所有能夠確保找到目標(biāo)值的方法中,找到花費(fèi)金錢最少的哪種。當(dāng)?shù)扔跁r(shí),即從中找到目標(biāo)數(shù)字,確保找到一個(gè)數(shù)字至少需要多少錢。
題目要求
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. 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. Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.
一個(gè)猜數(shù)字游戲,數(shù)字區(qū)間為1~n,每猜一次,會(huì)有人告訴你猜中了或者當(dāng)前的數(shù)字是大于結(jié)果值還是小于結(jié)果值。猜對(duì)則本次猜測(cè)免費(fèi),猜錯(cuò)則本次猜測(cè)需要花費(fèi)和數(shù)字等額的金錢。
問如果要確保能夠猜中數(shù)字,最少要花費(fèi)多少錢。
其實(shí)這題的英文表述有些問題,確切來說,在所有能夠確保找到目標(biāo)值的方法中,找到花費(fèi)金錢最少的哪種。
思路我們先用一個(gè)比較簡(jiǎn)單的數(shù)字來找規(guī)律。當(dāng)n等于3時(shí),即從1,2,3中找到目標(biāo)數(shù)字,確保找到一個(gè)數(shù)字至少需要多少錢。
查詢序列如下:
目標(biāo)值3:1,2 2
目標(biāo)值2:1,3
目標(biāo)值1:3,2,2
可見如果要找到1,2,3中任意一個(gè)數(shù)字,最少要花費(fèi)2元錢,即從2開始查詢,如果命中,則花費(fèi)0元,如果沒有命中也知道目標(biāo)值比2小還是比2大,下次猜測(cè)一定命中,因此該序列中找到任何一個(gè)數(shù)字最多花費(fèi)2元錢。
如此可見,假如要知道m(xù)in(1,n)的值,只要找到花費(fèi)最小的中間點(diǎn)k,即遞歸的公式相當(dāng)于min(1,n) = k + Math.max(min(1, k-1), min(k+1,n)) 1<=k<=n找到最小的min即可。
思路一:自頂向下的動(dòng)態(tài)規(guī)劃public int getMoneyAmount(int n) { int[][] tmp = new int[n+1][n+1]; for(int[] row: tmp){ Arrays.fill(row, Integer.MAX_VALUE); } return getMoneyAmount(n, 1, n, tmp); } public int getMoneyAmount(int n, int lft, int rgt, int[][] tmp) { if(lft>=rgt) return 0; if(tmp[lft][rgt] != Integer.MAX_VALUE) return tmp[lft][rgt]; for(int i = lft ; i<=rgt ; i++) { tmp[lft][rgt] = Math.min(tmp[lft][rgt], Math.max(i + getMoneyAmount(n, lft, i-1, tmp), i + getMoneyAmount(n, i+1, rgt, tmp))); } return tmp[lft][rgt]; }思路二:自底向上的動(dòng)態(tài)規(guī)劃
public int getMoneyAmount(int n) { int[][] dp = new int[n+1][n+1]; for(int i = 2 ; i<=n ; i++) { for(int j = i-1 ; j>0 ; j--) { int min = Integer.MAX_VALUE; for(int k = j+1 ; k
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77455.html
摘要:題目鏈接又是一道的題,關(guān)鍵是找。表示最少的,當(dāng)范圍是的時(shí)候。所以要求就應(yīng)該遍歷切分點(diǎn)找出最小的值,這個(gè)切分點(diǎn)可能把問題分成左邊或者右邊,要取最大值才能保證所有的值都能贏。 375. Guess Number Higher or Lower II 題目鏈接:https://leetcode.com/problems... 又是一道dp的題,關(guān)鍵是找subproblem。dp[i][j]表...
找出string里的單詞。 186. Reverse Words in a String II, 434. Number of Segments in a String combination類型題 77. Combinations 39. Combination Sum 40. Combination Sum II 216. Combination Sum III 494. Target S...
摘要:在線網(wǎng)站地址我的微信公眾號(hào)完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個(gè)題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語(yǔ)言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號(hào): showImg(htt...
摘要:題目要求游戲簡(jiǎn)單來說就是你隨手寫下一個(gè)位數(shù),并讓你同學(xué)猜這個(gè)數(shù)字是什么。第二次再在此基礎(chǔ)上計(jì)算重合的值和沒有重合的值的個(gè)數(shù)。這樣的話,如果下一次遇到重復(fù)但是位置不同的值,我們可以知道它是否已經(jīng)在中或是中出現(xiàn)過。 題目要求 You are playing the following Bulls and Cows game with your friend: You write down ...
Problem You are playing the following Bulls and Cows game with your friend: You write down a number and ask your friend to guess what the number is. Each time your friend makes a guess, you provide a ...
閱讀 1422·2023-04-26 01:58
閱讀 2297·2021-11-04 16:04
閱讀 1789·2021-08-31 09:42
閱讀 1776·2021-07-25 21:37
閱讀 1075·2019-08-30 15:54
閱讀 2083·2019-08-30 15:53
閱讀 3059·2019-08-29 13:28
閱讀 2700·2019-08-29 10:56