375. Guess Number Higher or Lower II
刷
Aug-01-2019
居然都4刷了,除了记得我做过之外完全没印象。
居然做出来了。。
对于n来说,我可以选1~n里任意一个,比如我选了3,对方一定会说答案在
[12]或者[4n]中较大的那边,所以还是个MinMax题,总算稍微了有了点MinMax的感觉。
但是1~n选哪个要遍历才行。。
dp[n] = dp[1~i) + i + dp(i~n] (i = 1~n)
class Solution {
public int getMoneyAmount(int n) {
int res = 0;
int[][] dp = new int[n+1][n+1];
dp[1][n] = getMinimalAmount(dp, 1, n);
return dp[1][n];
}
public int getMinimalAmount(int[][] dp, int l, int r) {
if (l > r) return 0;
if (l + 1 == r) return l;
if (l == r) return 0;
if (dp[l][r] != 0) return dp[l][r];
int tempMinimal = Integer.MAX_VALUE;
for (int i = l; i <= r; i ++) {
int leftPortion = getMinimalAmount(dp, l, i-1);
int currentPay = i;
int rightPortion = getMinimalAmount(dp, i+1, r);
int tempPay = currentPay + Math.max(leftPortion, rightPortion);
tempMinimal = Math.min(tempMinimal, tempPay);
}
dp[l][r] = tempMinimal;
return dp[l][r];
}
}
四刷?
极大极小算法。。还是叫极小极大的。。
首先要看怎么能保证赢。
比如2个数,猜第一个猜第二个都能保证下一轮我们赢定了,为了少交钱,我们猜小的。
比如3个数,猜第二个才能保证下一轮再猜一定能赢。
比如4个数,怎么猜都不能保证下一轮一定赢,所以要猜两轮。第一轮猜1,2,3还是4就很讲究了。
猜1就是num1 + dp[2]4
猜2就是dp[1]1 + num2或者num[1] + dp[3]4
...
4种里每种都算出来,看哪种花费最少,选最少的。
而现在有N种。。。
也是个game theory,我们2次决定中夹杂着对方的决定,对方的决定是对我们最不利的。
所谓最不利,就是我们选一个数之后,答案比我们的数大还是小是由对方决定的,他会看看答案比我们大他赚钱多还是答案比我们小他赚钱多,然后选个他赚钱多的。
所以选完数之后,我们的花费是当前选择的数,加上答案大的花费和答案小的花费里大的那个。
而我们的选择是,选哪个数花费最小。
所以就是在每个最大值里选个最小的。
public class Solution {
public int getMoneyAmount(int n) {
if (n <= 1) return 0;
int[][] dp = new int[n+1][n+1];
for (int[] num : dp) {
Arrays.fill(num, -1);
}
dp[1][n] = guess(1, n, dp);
return dp[1][n];
}
public int guess(int start, int end, int[][] dp) {
if (start > end) return 0;
if (end == start) return 0;
if (end - start == 1) return start;
if (dp[start][end] != -1) return dp[start][end];
int res = Integer.MAX_VALUE;
for (int i = start; i <= end; i++) {
int left = guess(start, i-1, dp);
int right = guess(i+1, end, dp);
int makeSure = Math.max(left, right);
res = Math.min(res, makeSure + i);
}
dp[start][end] = res;
return res;
}
}
一刷
这个题操了。
首先弄懂这个题要求什么就花了好久。
是这个意思……
给1到N的数,让你猜,不管你猜几,猜错了给你猜的数的钱。 猜8,错了,付8元。
然后问你有多少钱才能保证一定能找到答案。
其实可以理解为,不管答案是几,用你现有的钱,总能找到答案。
举个例子,假如有1到10让我猜,现在我有一个亿,我肯定能猜出来。但是问题是我没那么多钱,至少有几块钱能保证我猜出来。
这个题有一个假设,就是假设我不是傻逼。
比如1-10 我猜7,小了,那么结果是8 9 10中一个。接下来我肯定猜9,因为如果没猜中,比9小的话答案就是8,否则是10.
其实这个题,不用在乎答案是几,目的是要一个猜法,按这个猜法,一定能找到答案。
比如刚才的例子,1-10,7+9=16是我们需要的资本,16元保证不管1-10里哪个数是答案,我们都能猜到,最多花16元。
那么7+9是怎么来的?
首先看9
在猜了7之后,有2种可能,一种是答案比7小,一种是答案比7大。
所以答案要么出自1-6 要么出自 8- 10
为了 保证 一定能猜到,我们必须假设出自大的一边。
此时的花费就是当前的7+max(1-6,8-10)
那第一次的7是怎么来的,为什么第一次猜7?
没什么好办法,只能遍历,从1-10 假如猜1会如何,猜2会如何,遍历一次,找到最小的起始点,这里又是最小了。
其实我这种孤陋寡闻的弱智是第一次听说MiniMax这个概念,不是很理解,这个题想了好久才明白。
看代码。。
public class Solution {
public int getMoneyAmount(int n)
{
int[][] dp = new int[n+1][n+1];
return helper(1,n,dp);
}
public int helper(int left, int right, int[][] dp)
{
if(left < right)
{
if(dp[left][right] != 0) return dp[left][right]; //we already calculated it once, just return.
int temp = Integer.MAX_VALUE;
for(int n = left; n <= right; n++)
{
temp = Math.min(temp,n+Math.max(helper(left,n-1,dp),helper(n+1,right,dp)));
}
dp[left][right] = temp;
return temp;
}
else
{
return 0; //not return left, becuase I guess the right one
//thus we dont need to pay for this guess
}
}
}
375. Guess Number Higher or Lower II的更多相关文章
- 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)
[LeetCode]375. Guess Number Higher or Lower II 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...
- 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II
好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...
- LC 375. Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- [LeetCode] 375. Guess Number Higher or Lower II 猜数字大小之二
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- [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 gues ...
- leetcode 374. Guess Number Higher or Lower 、375. Guess Number Higher or Lower II
374. Guess Number Higher or Lower 二分查找就好 // Forward declaration of guess API. // @param num, your gu ...
- Leetcode 375. Guess Number Higher or Lower II
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...
- 375 Guess Number Higher or Lower II 猜数字大小 II
我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字.每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了.然而,当你猜了数字 x 并且猜错了的时候,你需 ...
- [leetcode]375 Guess Number Higher or Lower II (Medium)
原题 思路: miniMax+DP dp[i][j]保存在i到j范围内,猜中这个数字需要花费的最少 money. "至少需要的花费",就要我们 "做最坏的打算,尽最大的努 ...
随机推荐
- js监听
IE浏览器监听: function attachEvent(string eventFlag, function eventFunc) eventFlag: 事件名称,但要加上on,如onclick. ...
- YII2数据库操作出现类似Database Exception – yii\db\Exception SQLSTATE
yii2安装后,连接数据库,必须要安装pdo_mysql扩展
- PHP接口(interface)和抽象类(abstract)
interface 定义了一个接口类,它里面的方法其子类必须实现.接口是类的一个模板,其子类必须实现接口中定义的所有方法. interface User{ function getHeight ...
- SQLServer数据库 导出表和导入sql脚本
1.选择需要导出表的数据库--任务---生成脚本 2.显示:生成和发布脚本窗口--简介(某些可能关闭该页面的,可以省略该步骤),点击下一步 3.显示:生成和发布脚本窗口--选择对象--按照图片操作即可 ...
- netbeans git 配置(ssh方式)
git出问题了,自己又重新配置了下git. 参考文章: https://netbeans.org/kb/docs/ide/git_zh_CN.html#github
- STM32之DMA
一.DMA简介 1.DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式. CPU有转移数据.计算.控制程序转移等很多功能,但其实转 ...
- 黑马程序员-------.net基础知识三
条件执行语句 if 语句 语法: [csharp] view plaincopyprint? if(条件) { 语句1;语句2:语句3: ··· } 执行过程: 先判断条件是否为true ,如果为tr ...
- HDU 4493 Tutor 水题的收获。。
题目: http://acm.hdu.edu.cn/showproblem.php?pid=4493 题意我都不好意思说,就是求12个数的平均数... 但是之所以发博客,显然有值得发的... 这个题最 ...
- MOSFET管应用总结
/* *本文转载自互联网,仅供个人学习之用,请勿用于商业用途. */ 在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些 ...
- jquery - 通过点击切换文字内容
今天要写一个简单的显示/隐藏效果,本以为是挺简单的事儿,没想到还真因为基本功不扎实遇到了问题,这里跟大家分享一下. 百度了很多方法,精简能用的干货实在太少,最后还是通过去查jq的官方api才找到了解决 ...