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; } };
[记忆搜索] leetcode 808 Soup Servings
原文:https://www.cnblogs.com/fish1996/p/11318302.html