837. 新 21 点
Problem: 837. 新 21 点
文章目录
- 思路
- 解题过程
- 复杂度
- Code
思路
逆向 DP。
解题过程
先初始化所有介于
k
与k + maxPts
或n
之间的概率为1
,然后将k - 1
初始化,进行逆向 DP ,最后返回dp[0]
即手中和为0
时的概率即可。
复杂度
-
时间复杂度: O(n)O(n)O(n)
-
空间复杂度: O(n)O(n)O(n)
Code
class Solution {public:double new21Game(int n, int k, int maxPts) {if (k == 0) {return 1.0;}vector<double> dp(k + maxPts);for (int i = k; i <= n && i < k + maxPts; i++) {dp[i] = 1.0;}dp[k - 1] = 1.0 * min(n - k + 1, maxPts) / maxPts;for (int i = k - 2; i >= 0; i--) {dp[i] = dp[i + 1] - (dp[i + maxPts + 1] - dp[i + 1]) / maxPts;}return dp[0];}};