题目:
我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。
提示:
1 <= n <= 200
代码:
class Solution {
public int getMoneyAmount(int n) {
//初始化
int [][]dp = new int[n + 1][n + 1];
//正向无法获得dp[k + 1][j]),需要反向找
for(int i = n - 1; i >= 1; i--){
for(int j = i + 1; j <= n; j++){
dp[i][j] = Integer.MAX_VALUE;
for(int k = i; k < j; k ++){
// 左右二选一得到一个结果,然后取结果中最小的
dp[i][j] = Math.min(dp[i][j], k + Math.max(dp[i][k - 1] , dp[k + 1][j]));
}
}
}
return dp[1][n];
}
}
总结:打卡十七天,题目难度为中等,和昨日的题目类似,用的动态规划方法,感觉自身算法能力还需加强