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
	}
}

执行结果如下:

在这里插入图片描述


左神java代码