808. 分汤
# 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 |
示例 2:
输入: n = 100 |
提示:
- 0 <= n <= $10^9$
# 题解
class Solution {
public:
double soupServings(int n) {
n = ceil((double) n / 25);
if (n >= 179) {
return 1.0;
}
vector<vector<double>> dp(n + 1, vector<double>(n + 1));
dp[0][0] = 0.5;
for (int i = 1; i <= n; i++) {
dp[0][i] = 1.0;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = (dp[max(0, i - 4)][j] + dp[max(0, i - 3)][max(0, j - 1)] +
dp[max(0, i - 2)][max(0, j - 2)] + dp[max(0, i - 1)][max(0, j - 3)]) / 4.0;
}
}
return dp[n][n];
}
};
```
复杂度分析
- 时间复杂度:$O(C^2)\$
- 空间复杂度:$O(C^2)\$
Invitation
x-17
202111170521
created:2021/11/17
Welcome to X
月缺不改光,剑折不改钢
共矜然诺心,各负纵横志
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 潇十七!
评论