LeetCode 837.新 21 点:动态规划+滑动窗口

【LetMeFly】837.新 21 点:动态规划+滑动窗口

力扣题目链接:https://leetcode.cn/problems/new-21-game/

爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:

爱丽丝以 0 分开始,并在她的得分少于 k 分时抽取数字。 抽取时,她从 [1, maxPts] 的范围中随机获得一个整数作为分数进行累计,其中 maxPts 是一个整数。 每次抽取都是独立的,其结果具有相同的概率。

当爱丽丝获得 k或更多分 时,她就停止抽取数字。

爱丽丝的分数不超过 n 的概率是多少?

与实际答案误差不超过 10-5 的答案将被视为正确答案。

 

示例 1:

输入:n = 10, k = 1, maxPts = 10
输出:1.00000
解释:爱丽丝得到一张牌,然后停止。

示例 2:

输入:n = 6, k = 1, maxPts = 10
输出:0.60000
解释:爱丽丝得到一张牌,然后停止。 在 10 种可能性中的 6 种情况下,她的得分不超过 6 分。

示例 3:

输入:n = 21, k = 17, maxPts = 10
输出:0.73278

 

提示:

  • 0 <= k <= n <= 104
  • 1 <= maxPts <= 104

解题方法:动态规划

这道题有点“反向dp”。令dp[i]dp[i]dp[i]表示当爱丽丝获得iii分时,最终获胜的概率。

其中“获胜”是指最终分数≥k\geq kk≤n\leq nn,那么初始状态0分时dp[0]dp[0]dp[0]即位所求。

一旦爱丽丝分数≥k\geq kk她就立即停止抽牌,由于最后一张牌的分数范围是111maxPtsmaxPtsmaxPts,所以最终分数的可能范围是从kkkk+maxPts−1k+maxPts-1k+maxPts1,可得dp数组的初始状态:

dp[i]={1if i≤n0else ,k≤i<k+maxPtsdp[i]=\begin{cases} 1 \text{ if } i\leq n \\ 0 \text{ else } \end{cases}\ \ \ ,\ k\leq i\lt k+maxPts dp[i]={1 if in0 else    , ki<k+maxPts

那么在她手中的分数还未达到游戏终止时(假设当前为iii分),由于再抽一张牌可以等概率达到i+1,i+2,⋯,i+maxPtsi+1, i+2, \cdots, i+maxPtsi+1,i+2,,i+maxPts,所以可得状态转移方程:

dp[i]=dp[i+1]+dp[i+2]+⋯+dp[i+maxPts]maxPtsdp[i] = \frac{dp[i+1]+dp[i+2]+\dots+dp[i+maxPts]}{maxPts}dp[i]=maxPtsdp[i+1]+dp[i+2]++dp[i+maxPts]

由于每次计算dp[i+1]+dp[i+2]+⋯+dp[i+maxPts]dp[i+1]+dp[i+2]+\dots+dp[i+maxPts]dp[i+1]+dp[i+2]++dp[i+maxPts]太过于机械和重复,所以可以参考“滑动窗口”的思想,使用一个变量sss记录“窗口”中maxPtsmaxPtsmaxPts个元素的和,并随着窗口的前移不断更新sss即可。

  • 时间复杂度O(k+maxPts)O(k+maxPts)O(k+maxPts)
  • 空间复杂度O(k+maxPts)O(k+maxPts)O(k+maxPts)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-08-17 19:33:11* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-08-17 19:38:09*/
class Solution {
public:double new21Game(int n, int k, int maxPts) {vector<double> dp(k + maxPts);double s = 0;for (int i = k; i < k + maxPts; i++) {dp[i] = i <= n;s += dp[i];}for (int i = k - 1; i >= 0; i--) {dp[i] = s / maxPts;s = s - dp[i + maxPts] + dp[i];}return dp[0];}
};
Python
'''
Author: LetMeFly
Date: 2025-08-17 19:33:11
LastEditors: LetMeFly.xyz
LastEditTime: 2025-08-17 19:40:07
'''
class Solution:def new21Game(self, n: int, k: int, maxPts: int) -> float:dp = [0.] * (k + maxPts)s = 0.for i in range(k, k + maxPts):dp[i] = 1. if i <= n else 0.s += dp[i]for i in range(k - 1, -1, -1):dp[i] = s / maxPtss = s + dp[i] - dp[i + maxPts]return dp[0]
Java
/** @Author: LetMeFly* @Date: 2025-08-17 19:33:11* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-08-17 19:43:15*/
class Solution {public double new21Game(int n, int k, int maxPts) {double[] dp = new double[k + maxPts];double s = 0;for (int i = k; i < k + maxPts; i++) {dp[i] = i <= n ? 1. : 0.;s += dp[i];}for (int i = k - 1; i >= 0; i--) {dp[i] = s / maxPts;s = s + dp[i] - dp[i + maxPts];}return dp[0];}
}
Go
/** @Author: LetMeFly* @Date: 2025-08-17 19:33:11* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-08-17 22:20:30*/
package mainfunc new21Game(n int, k int, maxPts int) float64 {dp := make([]float64, k + maxPts)s := 0.for i := k; i < k + maxPts; i++ {if i <= n {dp[i] = 1.} else {dp[i] = 0.}s += dp[i]  // 别忘了}for i := k - 1; i >= 0; i-- {dp[i] = s / float64(maxPts)s = s + dp[i] - dp[i + maxPts]}return dp[0]
}
Rust
/** @Author: LetMeFly* @Date: 2025-08-17 19:33:11* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-08-17 22:31:00*/
impl Solution {pub fn new21_game(n: i32, k: i32, max_pts: i32) -> f64 {let k: usize = k as usize;let max_pts: usize = max_pts as usize;let n: usize = n as usize;let mut dp: Vec<f64> = vec![0 as f64; k + max_pts];let mut s: f64 = 0.;for i in k..(k+max_pts) {if i <= n {dp[i] = 1.;} else {dp[i] = 0.;}s += dp[i];}for i in (0..k).rev() {dp[i] = s / max_pts as f64;s = s + dp[i] - dp[i + max_pts];}dp[0]}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96088.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces 盒装苹果

题目来源&#xff1a;问题 - 2107B - Codeforces 这道题其实只需要判断两个要点&#xff0c;首先判断一下最大值-1后与最小值的差值是否>k&#xff0c;这里有个小细节&#xff0c;当有多个最大值时&#xff0c;可以先将一个最大值-1后再排序&#xff0c;判断新数组最大值与最…

数据结构--------堆

目录 二叉树 树的概念与结构 非树形结构&#xff1a; 注意&#xff1a; 树的相关术语 树的表示 孩子兄弟表示法 树形结构实际运用场景&#xff08;拓展&#xff09; 1. 文件系统管理 2. 数据库与索引 3. 编程语言与数据结构 信息组织与展示 1. 思维导图 2. 目录与…

VSCode Cursor 大模型 插件扩展 Kilo Code 配置

1.1 概述 Kilo Code 是一个 VSCode Cursor 插件扩展&#xff0c;提供了对多种 AI 模型的支持&#xff0c;包括 Claude Code 和 Qwen3。通过正确配置 Kilo Code&#xff0c;可以在开发过程中获得更好的 AI 辅助编程体验。 Kilo使用文档&#xff1a;https://kilocode.ai/docs/zh-…

深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理

在现代游戏开发中&#xff0c;Uniform变量是实现高质量图形渲染的关键元素。不同游戏引擎对Uniform变量的管理方式有所不同&#xff0c;了解这些差异可以帮助开发者在选择引擎时做出更明智的决策。本文将深入探讨Unity、Unreal Engine和Godot引擎中Uniform变量的管理方式&#…

遨游旅游天地,开启探索未知的梦幻之旅

你是否也怀揣着一颗对世界充满好奇的心&#xff0c;渴望踏上探索旅游世界的奇妙旅程&#xff1f;旅游&#xff0c;是一场与未知的邂逅&#xff0c;是心灵的一次自由翱翔。想象一下&#xff0c;你置身于神秘莫测的撒哈拉沙漠。当夕阳的余晖洒在连绵起伏的沙丘上&#xff0c;那金…

SConscript 脚本入门教程

第一章&#xff1a;什么是 SCons 和 SConscript&#xff1f;核心概念SCons 是一个现代化的构建工具&#xff0c;用于自动化软件构建过程&#xff0c;类似于 Make 但功能更强大、语法更简洁。SConstruct&#xff1a;是 SCons 的主配置文件&#xff0c;通常在项目根目录&#xff…

【深度学习】PyTorch从0到1——手写你的第一个卷积神经网络模型,AI模型开发全过程实战

引言本次准备建立一个卷积神经网络模型&#xff0c;用于区分鸟和飞机&#xff0c;并从CIFAR-10数据集中选出所有鸟和飞机作为本次的数据集。以此为例&#xff0c;介绍一个神经网络模型从数据集准备、数据归一化处理、模型网络函数定义、模型训练、结果验证、模型文件保存&#…

云计算核心技术之容器技术

一、容器技术 1.1、为什么需要容器 在使用虚拟化一段时间后&#xff0c;发现它存在一些问题&#xff1a;不同的用户&#xff0c;有时候只是希望运行各自的一些简单程序&#xff0c;跑一个小进程。为了不相互影响&#xff0c;就要建立虚拟机。如果建虚拟机&#xff0c;显然浪费就…

微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题

前言 uni.chooseLocation打开地图选择位置&#xff0c;看官方文档介绍的比较简单&#xff0c;但是需要注意的细节不少&#xff0c;如果没有注意可能就无法使用该API或者报错&#xff0c;下面就把详细的配置方法做一下介绍。 一、勾选位置接口 ①在uniapp项目根目录找到manif…

从财务整合到患者管理:德国医疗集团 Asklepios完成 SAP S/4HANA 全链条升级路径

目录 挑战 解决方案 详细信息 Asklepios成立于1985年&#xff0c;目前拥有约170家医疗机构&#xff0c;是德国大型私营诊所运营商。Asklepios是希腊和罗马神话中的医神。 挑战 Asklepios希望进一步扩大其作为数字医疗保健集团的地位。2020年9月&#xff0c;该公司与SNP合作…

高频PCB厂家及工艺能力分析

一、技术领先型厂商&#xff08;适合高复杂度、高可靠性设计&#xff09;这类厂商在高频材料处理、超精密加工和信号完整性控制方面具备深厚积累&#xff0c;尤其适合军工、卫星通信、医疗设备等严苛场景&#xff1a;深南电路&#xff1a;在超高层板和射频PCB领域是行业标杆&am…

AJAX 与 ASP 的融合:技术深度解析与应用

AJAX 与 ASP 的融合:技术深度解析与应用 引言 随着互联网技术的不断发展,AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)技术逐渐成为构建动态网页和应用程序的重要工具。本文将深入探讨AJAX与ASP的融合,分析其原理、应用场景以及在实际开发中的优…

MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)

原文地址&#xff1a;MuMu模拟器Pro Mac 安卓手机平板模拟器 MuMu模拟器 Pro mac版&#xff0c;是一款MuMuPlayer安卓模拟器&#xff0c;可以畅快运行安卓游戏和应用。 MuMu模拟器Pro搭载安卓12操作系统&#xff0c;极致释放设备性能&#xff0c;最高支持240帧画面效果&#…

Oracle维护指南

Part 1 Oracle 基础与架构#### **1.1 概述** - **Oracle 数据库版本历史与特性对比** - **版本演进**&#xff1a; - Oracle 8i&#xff08;1999&#xff09;&#xff1a;支持 Internet 应用&#xff0c;引入 Java 虚拟机&#xff08;JVM&#xff09;。 - Oracle 9i&#…

如何为PDF文件批量添加骑缝章?

骑缝章跨越多页文件的边缘加盖&#xff0c;一旦文件被替换其中某一页或顺序被打乱&#xff0c;印章就无法对齐&#xff0c;能立刻发现异常。这有效保障了文件的完整性和真实性。它是纯净免费&#xff0c;不带广告&#xff0c;专治各类PDF盖章需求。用法极简&#xff1a;文件直接…

组合时代的 TOGAF®:为模块化企业重新思考架构

随着企业努力追求敏捷性和创新性&#xff0c;组合性正逐渐成为一项基础性的设计原则。组合思维改变了企业交付能力的方式 —— 更倾向于采用模块化、独立的组件&#xff0c;这些组件可以快速组装和重组。本文探讨了长期以来作为企业架构框架的TOGAF标准如何演进以支持组合架构。…

电子元器件-电阻终篇:基本原理,电阻分类及特点,参数/手册详解,电阻作用及应用场景,电阻选型及实战案例

目录 一、基本原理 1.1 介绍 1.2 计算公式​编辑 1.3 单位 1.4 标称值 二、分类及特点 2.1电阻分类及特点介绍 2.2常用电阻器件详细介绍 三、参数/数据手册解读 3.1 阻值 3.2 封装&功率 3.3 精度 3.5 额定电压 3.6 温度系数(TCR) 3.7 扩展 四、作用与使用场…

【软件测试】电商购物项目-各个测试点整理(六)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、优惠券测试点 …

心路历程-启动流程的概念

我们之前已经安装过系统&#xff0c;其实兴奋的内心已经无以言表&#xff1b; 记得刚开始的那份喜悦是没办法演说的&#xff1b;可是高兴之余&#xff0c;好像突然又心情EMO了&#xff1b; 为何呢&#xff1f;因为系统装完了&#xff0c;你也不知道能够干什么&#xff1b; 所以…

Kubernetes Ingress实战:从环境搭建到应用案例

目录 一、概述 版本对比图 二、 Ingress应用案例 2.1 环境准备 2.2 验证-NodePort模式 设置Http代理 2.3 验证-LoadBalancer模式 修改ARP模式&#xff0c;启用严格ARP模式 搭建metallb支持LoadBalancer 普通的service测试 ingress访问测试&#xff1a; 一、概述 Ser…