力扣-808. 分汤
本文最后更新于:2022年11月21日 下午
题目描述
思路及实现
其实这题我一开始根本没想什么动态规划,就想着无脑递归不就行了吗?但是递归存在两个问题:一是超出时间限制,二是超出递归深度。
第一个我们可以利用缓存技术大大压缩时间,但是第二个就必须想其他办法解决了,因为题目给的是0 <= n <= 10^9
,但是仔细观察到题目说返回值在正确答案10^-5
的范围内将被认为是正确的,
什么意思呢?就是如果结果> 0.99999
那么就是返回1.0
。按照题目的分配方法,虽然每个分配方法都是0.25
几率,但是肯定是 A 平均分得更多的,也就是说我们能够找到一个θ
,使得当n >= θ
时,有ans > 0.99999
。
动态规划
要找到这个整数,就要使用动态规划来求解了。首先先压缩一下题目给的数据,因为分配方法都是25
的倍数,所以可以用(n + 24) // 25
来压缩,相应的分配方法变成:(4, 0), (3, 1), (2, 2), (1, 3)。
然后就是找到思路:
接着写出程序即可
1 |
|
深度优先搜索 + 缓存技术(记忆化搜索)
只要我们写出了动态规划写法,就能通过它找到θ
了,写一段代码让n
从0
开始遍历到5000
或者差不多的数就好了,然后设置个条件,返回的结果> 0.99999
的时候就输出这个数就好了。然后就得到了4451
这个答案。
那就好办了,那我直接进行递归并利用缓存技术顺便让n > 4450
的时候直接返回1.0
即可!
OK,过了。
1 |
|
希望本文章能够帮到您~
力扣-808. 分汤
https://map1e-g.github.io/2022/11/21/leetcode-808/