[记忆搜索] leetcode 808 Soup Servings

problem:https://leetcode.com/problems/soup-servings

        用的记忆搜索。第一次提交栈溢出了(虽然已经做了记忆)……之后在评论区发现了宝藏优化方法!以及发现自己没有必要返回pair,直接对情况2返回0.5就可以了。

class Solution {
public:
    double a_empty_first = 0.0;
    double a_and_b_empty = 0.0;
    unordered_map<int, unordered_map<int, pair<double,double>>> dp;

    pair<double,double> dfs(int numA, int numB)
    {
        static int count = 0;
        if (dp.find(numA) != dp.end() && dp[numA].find(numB) != dp[numA].end())
        {
            return dp[numA][numB];
        }
        if (numA <= 0 && numB <= 0)
        {
            return { 0.0, 1.0 };
        }
        if (numA <= 0 && numB > 0)
        {
            return { 1.0, 0.0 };
        }
        if (numB <= 0)
        {
            return { 0.0,0.0 };
        }

        double frequencyA = 0.0;
        double frequencyB = 0.0;
        vector<int> dA = { 100,75,50,25 };
        for (int k = 0; k < 4; k++)
        {
            auto res = dfs(numA - dA[k], numB - 100 + dA[k]);
            frequencyA += res.first * 0.25;
            frequencyB += res.second * 0.25;
        }

        return dp[numA][numB] = { frequencyA ,frequencyB };
    }
    double soupServings(int N) {
        if (N > 5000) return 1.0;
        auto result = dfs(N, N);
        double a_empty_first = result.first;
        double a_and_b_empty = result.second;
        return a_empty_first + 0.5 * a_and_b_empty;
    }
};

 

转载于:https://www.cnblogs.com/fish1996/p/11318302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值