leetcode837. 新21点

本文探讨了LeetCode上一个基于21点游戏规则的编程挑战,通过多次尝试与优化,最终解决了爱丽丝在游戏中不超过特定分数的概率计算问题。文章详细记录了从递归到动态规划的优化过程,分享了作者的心得与技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
如果有我没有写博客的其他题目需要讨论,欢迎评论,一起探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值