原题目:https://leetcode-cn.com/problems/new-21-game/
思路:
当手中的牌是i时,获胜的概率是:d[i] = 1/w*(d[i+1]+....+dp[i+w])
当进行最后一次抽牌时,手中牌的最大值应该为k-1;因为》=k就不可以抽牌了。
所以最后手中最大的牌面是k+w-1;在[k,k+w-1]时,收的的牌小于等于N的概率是1,大于N的概率是0.我们 可以反推出d[k-1]的概率。因为[k,k+w-1]可以根据k-1抽牌得到。
同时我们可以根据[k-1,k-w+2]得到k-1的概率,一直前移,就可以得到最后(没有抽牌时)的结果。
代码:
class Solution {
public:
double new21Game(int N, int K, int W) {
vector<double> dp(K+W);
double s=0;
for(int i=K;i<K+W && i<=N;i++){
s++;
dp[i]=1;
}
for(int i=K-1;i>=0;i--){
dp[i] = 1.0/W*s;
s = s-dp[i+W]+dp[i];
}
return dp[0];
}
};