Problem: 837. 新 21 点
思路
动态规划+滑动窗口。
dp[i]
表示牌面为i
时获胜的概率。
[k,k+w-1]
,dp[i]
要么为1
,要么为0
。
[0,k-1]
,dp[i]=1/maxPts*(dp[i+1]+dp[i]...+dp[i+w])
解题过程
用一个变量
s
累加结果,窗口移动时减去右面的,加上左面的。
复杂度
- 时间复杂度: O ( k + m a x P t s ) O(k+maxPts) O(k+maxPts)
- 空间复杂度: O ( k + m a x P t s ) O(k+maxPts) O(k+maxPts)
Code
class Solution {
public:
double new21Game(int n, int k, int maxPts) {
vector<double> dp(k + maxPts, 0.0);
double s = 0.0;
for (int i = k; i < k + maxPts; i++) {
dp[i] = (i <= n ? 1.0 : 0.0);
s += dp[i];
}
for (int j = k - 1; j >= 0; j--) {
dp[j] = s / maxPts;
s = s - dp[j + maxPts] + dp[j];
}
return dp[0];
}
};