[LeetCode] 375. Guess Number Higher or Lower II 猜数字大小 II
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.
Hint:
- The best strategy to play the game is to minimize the maximum loss you could possibly face. Another strategy is to minimize the expected loss. Here, we are interested in thefirst scenario.
- Take a small example (n = 3). What do you end up paying in the worst case?
- Check out this article if you're still stuck.
- The purely recursive implementation of minimax would be worthless for even a small n. You MUST use dynamic programming.
- As a follow-up, how would you modify your code to solve the problem of minimizing the expected loss, instead of the worst-case loss?
Credits:
Special thanks to @agave and @StefanPochmann for adding this problem and creating all test cases.
374. Guess Number Higher or Lower 的拓展,这题每猜一次要给一次和猜的数字相等的钱,求出最少多少钱可以保证猜出。
解法:根据提示,这道题需要用到Minimax极小化极大算法。要用DP来做,需要建立一个二维的dp数组,其中dp[i][j]表示从数字i到j之间猜中任意一个数字最少需要花费的钱数。需要遍历每一段区间[j, i],维护一个全局最小值global_min变量,然后遍历该区间中的每一个数字,计算局部最大值local_max = k + max(dp[j][k - 1], dp[k + 1][i]),然后更新全局最小值。
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution( object ): def getMoneyAmount( self , n): """ :type n: int :rtype: int """ pay = [[ 0 ] * n for _ in xrange (n + 1 )] for i in reversed ( xrange (n)): for j in xrange (i + 1 , n): pay[i][j] = min (k + 1 + max (pay[i][k - 1 ], pay[k + 1 ][j]) \ for k in xrange (i, j + 1 )) return pay[ 0 ][n - 1 ] |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public : int getMoneyAmount( int n) { vector<vector< int >> pay(n + 1, vector< int >(n)); for ( int i = n - 1; i >= 0; --i) { for ( int j = i + 1; j < n; ++j) { pay[i][j] = numeric_limits< int >::max(); for ( int k = i; k <= j; ++k) { pay[i][j] = min(pay[i][j], k + 1 + max(pay[i][k - 1], pay[k + 1][j])); } } } return pay[0][n - 1]; } }; |
类似题目:
[LeetCode] 374. Guess Number Higher or Lower 猜数字大小
All LeetCode Questions List 题目汇总
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
· 重磅发布!DeepSeek 微调秘籍揭秘,一键解锁升级版全家桶,AI 玩家必备神器!