C ++中的新21游戏
假设Rima玩以下游戏,该游戏大致基于纸牌游戏“21”。因此,Rima从0分开始,并在她少于K分时画数字。现在,在每次绘制期间,她从[1,W]的范围内随机获得整数个点,其中W是给定的,那是整数。现在,每个抽签都是独立的,并且结果具有相等的概率。当Rima获得K点或更多点时,她停止绘制数字。我们必须找到她的N分或更少的概率吗?
因此,如果N=6,K为1,W为10,那么答案将为0.6,因为Rima得到一张牌,然后停止,在10个概率中有6个,她等于或低于N=6分。
为了解决这个问题,我们将遵循以下步骤-
如果k为0,或者N>=K+W,则返回1
制作大小为N+1的数组dp,设置dp[0]:=1
设置wsum:=1.0,ret:=0.0
当我在1到N的范围内
dp[i]:=wsum/W
如果i<K,则wsum:=wsum+dp[i],否则ret:=ret+dp[i]
如果i–W>=0,则wsum:=wsum–dp[i-W]
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: double new21Game(int N, int K, int W) { if(K == 0 || N >= K + W) return 1.0; vector <double> dp (N + 1); dp[0] = 1; double Wsum = 1.0; double ret = 0.0; for(int i = 1; i <= N; i++){ dp[i] = Wsum / W; if(i < K){ Wsum += dp[i]; }else ret += dp[i]; if(i - W >= 0) Wsum -= dp[i - W]; } return ret; } }; main(){ Solution ob; cout << (ob.new21Game(6, 1, 10)); }
输入项
6 1 10
输出结果
0.6