今天做了一道力扣觉着很有意思力扣837 这个做的费点时间 想半天才想通这位大佬写的 看一看
这是我自己的一些理解 这里我改成了void 形式便于输出
package Leetcode;
public class Demo837 {
/*这题很难理解 其实就是抓牌游戏 N=21 K=17 W=10
* 我从0开始抓范围是0-w的牌 然后累加 然后当手上的分数不到17可以继续抓 但是只要到了17
* 比如16抓一个1就到了17 这个时候就不能抓了 让我们求概率 :
* 我最后得分不超过 N的概率
* 其实也就是16的时候抓12345都是赢678910是数 这个被抓比率相同赢得概率是1也相同
* 但是后面比如15 这个时候你抓到1 之后你赢得概率就是刚刚算类的上面那个概率
* 抓到2赢得概率还是1
* 所以就想到了一个
* 16赢得概率等于 (17赢得概率+18+...+26)/10
* 15的概率等于(16的概率 +17赢得概率+...+26赢得概率)/10
* 这样就可以用一个数组17+10其实只需要16+10 但是数组开始的地方就是要求的概率
* 这里其实有点想不通 但是吧就是数是0赢得概率就是我们求的概率 本来我以为是所有0-17概率和想一下
* 不对 因为16的概率会用到很多地方
* 所以dp【0】就是要求的
*
* */
public static void main(String[] args) {
new21Game(21,17,10);
}
public static void new21Game(int N, int K, int W) {
double[] dp=new double[K+W];
if (N - K + 1 >= W) {
dp[0]=1.0;//避免出现特殊案例 比如101
}
//给K到N都赋值为1 N到k+w-n都为0
for (int i = K; i <=N ; i++) {
dp[i]=1.00;
}
double startgailv=N-K+1;
for (int i = K-1; i >=0 ; i--) {
dp[i]=startgailv/W;
startgailv=startgailv-dp[W+i]+dp[i];
}
System.out.println(dp[0]);
}
}