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+maxPts?1,可得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
英文地址,請注明出處:http://en.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…