• 【LeetCode每日一题:808.分汤~~~边界条件的特判+记忆化搜索】


    题目描述

    有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作:

    提供 100ml 的 汤A 和 0ml 的 汤B 。
    提供 75ml 的 汤A 和 25ml 的 汤B 。
    提供 50ml 的 汤A 和 50ml 的 汤B 。
    提供 25ml 的 汤A 和 75ml 的 汤B 。
    当我们把汤分配给某人之后,汤就没有了。每个回合,我们将从四种概率同为 0.25 的操作中进行分配选择。如果汤的剩余量不足以完成某次操作,我们将尽可能分配。当两种类型的汤都分配完时,停止操作。

    注意 不存在先分配 100 ml 汤B 的操作。

    需要返回的值: 汤A 先分配完的概率 + 汤A和汤B 同时分配完的概率 / 2。返回值在正确答案 10-5 的范围内将被认为是正确的。

    示例 1:

    输入: n = 50
    输出: 0.62500
    解释:如果我们选择前两个操作,A 首先将变为空。
    对于第三个操作,A 和 B 会同时变为空。
    对于第四个操作,B 首先将变为空。
    所以 A 变为空的总概率加上 A 和 B 同时变为空的概率的一半是 0.25 *(1 + 1 + 0.5 + 0)= 0.625。
    示例 2:

    输入: n = 100
    输出: 0.71875

    提示:

    0 <= n <= 109​​​​​​​

    求解思路

    1. 这道题目不是很好实现,容易忽略一些边界信息,一些边界条件需要打表求得,然后特殊判断输出,可以参考一下官方题解
    2. 官方题解求解思路

    实现代码

    class Solution {
        private double[][] map;
    
        public double soupServings(int n) {
            n = (int) Math.ceil((double) n / 25);
            if (n >= 179) {
                return 1.0;
            }
            map = new double[n + 1][n + 1];
            return process(n, n);
        }
    
        public double process(int a, int b) {
            if (a <= 0 && b <= 0) {
                //A和B同时倒完返回0.5
                return 0.5;
            } else if (a <= 0) {
                //A先倒完返回1
                return 1;
            } else if (b <= 0) {
                //B先倒完直接返回0
                return 0;
            }
            if (map[a][b] == 0) {
                map[a][b] = 0.25 * (process(a - 4, b) + process(a - 3, b - 1) + process(a - 2, b - 2) + process(a - 1, b - 3));
            }
            return map[a][b];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行结果

    在这里插入图片描述

  • 相关阅读:
    web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
    关于如何重燃学习的激情
    2022年十佳项目管理工具横向测评,总有一款适合你
    Java连接FTP服务器上传文件报错
    LeetCode第20题:有效的括号
    家居江湖掀起「夺魁战」,红星美凯龙如何打造品牌增量场?
    软件卸载quickuninstall
    学习记录683@类别不平衡问题解决的基本策略之再缩放的数学解释
    实现元宇宙需面临的三大挑战
    wpf devexpress数据统计
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127958453