https://leetcode-cn.com/problems/new-21-game/submissions/
爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:
爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。
当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?
这道题我经历了多次超时才解出来的!
第一次,使用递归,超时
第二次,递归改成动态规划,还是超时
第三次,优化一下
第四次,新增ress数组,保存res数组前n个的和
多次优化,没有放弃,不容易啊
代码:
public double new21Game(int N, int K, int W) {
double[] res = new double[K + 1];
double[] ress = new double[K + 1];
int nk = N - K;
res[0] = 1.0;
for (int i = 1; i <= K; i++) {
double ans = 0.0;
int maxW = Math.min(W, i - 1);
ans = (ress[i - 1] - ress[i - maxW - 1]) / W;
if (W >= i) {
ans += (Math.min(nk, W - i) + 1.0) / W;
}
res[i] = ans;
ress[i] = ress[i - 1] + res[i];
}
return res[K];
}
leetcode的一些已经写的觉得有意思的其他题目
https://blog.youkuaiyun.com/qq_33321609/article/category/9012437
如果有我没有写博客的其他题目需要讨论,欢迎评论,一起探讨