Skip to content

Commit 62e19d0

Browse files
authored
Create soup-servings.cpp
1 parent 64e66dc commit 62e19d0

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

C++/soup-servings.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Time: O(1)
2+
// Space: O(1)
3+
4+
class Solution {
5+
private:
6+
template <typename T>
7+
struct PairHash {
8+
size_t operator()(const pair<T, T>& p) const {
9+
size_t seed = 0;
10+
seed ^= std::hash<T>{}(p.first) + 0x9e3779b9 + (seed<<6) + (seed>>2);
11+
seed ^= std::hash<T>{}(p.second) + 0x9e3779b9 + (seed<<6) + (seed>>2);
12+
return seed;
13+
}
14+
};
15+
16+
public:
17+
double soupServings(int N) {
18+
if (N > 4800) {
19+
return 1.0;
20+
}
21+
unordered_map<pair<int, int>, double, PairHash<int>> lookup;
22+
N = (N + 24) / 25;
23+
return dp(N, N, &lookup);
24+
}
25+
26+
private:
27+
double dp(int a, int b, unordered_map<pair<int, int>, double, PairHash<int>> *lookup) {
28+
if (lookup->count(make_pair(a, b))) {
29+
return (*lookup)[make_pair(a, b)];
30+
}
31+
if (a <= 0 && b <= 0) {
32+
return 0.5;
33+
}
34+
if (a <= 0) {
35+
return 1.0;
36+
}
37+
if (b <= 0) {
38+
return 0.0;
39+
}
40+
(*lookup)[make_pair(a, b)] = 0.25 * (dp(a - 4, b, lookup) +
41+
dp(a - 3, b - 1, lookup) +
42+
dp(a - 2, b - 2, lookup) +
43+
dp(a - 1, b - 3, lookup));
44+
return (*lookup)[make_pair(a, b)];
45+
}
46+
};

0 commit comments

Comments
 (0)