2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选相关的知识,希望对你有一定的参考价值。
2022-03-09:我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。
如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。
答案2022-03-09:
容易想到二分法,但二分法是不对的。
递归或动态规划。
只有1个数字的时候,返回0。
只有两个数字的时候,选小的。
大于等于3个数字的时候,每一个都试一下。
代码用golang编写。代码如下:
package main
import "fmt"
func main()
ret := getMoneyAmount2(1000)
fmt.Println(ret)
func getMoneyAmount2(n int) int
dp := make([][]int, n+1)
for i := 0; i < n+1; i++
dp[i] = make([]int, n+1)
for i := 1; i < n; i++
dp[i][i+1] = i
for L := n - 2; L >= 1; L--
for R := L + 2; R <= n; R++
dp[L][R] = getMin(L+dp[L+1][R], R+dp[L][R-1])
for M := L + 1; M < R; M++
dp[L][R] = getMin(dp[L][R], M+getMax(dp[L][M-1], dp[M+1][R]))
return dp[1][n]
func getMax(a, b int) int
if a > b
return a
else
return b
func getMin(a, b int) int
if a < b
return a
else
return b
执行结果如下:
以上是关于2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选的主要内容,如果未能解决你的问题,请参考以下文章