当前位置: 首页 > web >正文

Leetcode837.新21点

题目

837. 新 21 点

算法标签: 数学, 概率, 动态规划

思路

定义状态表示为 f [ i ] f[i] f[i], 表示分数达到 i i i的时候的概率, 分析状态计算, 假设当前的分数是 i i i, 抽取到的牌得分数是 x x x, 那么当前状态就会转移到 f [ i + x ] f[i + x] f[i+x], 状态转移方程如下

d p [ i ] = 1 maxPts ( d p [ i + 1 ] + d p [ i + 2 ] + ⋯ + d p [ i + maxPts ] ) dp[i] = \frac{1}{\text{maxPts}} \left( dp[i+1] + dp[i+2] + \cdots + dp[i+\text{maxPts}] \right) dp[i]=maxPts1(dp[i+1]+dp[i+2]++dp[i+maxPts])

计算时间复杂度, 外层枚举分数, 内层也需要枚举分数, 总的时间复杂度来到了 O ( n 2 ) O(n ^ 2) O(n2), 时间复杂度过高, 需要进行优化, 推 i = i − 1 i = i - 1 i=i1时的表达式

d p [ i − 1 ] = 1 maxPts ( d p [ i ] + d p [ i + 1 ] + ⋯ + d p [ i + maxPts - 1 ] ) dp[i - 1] = \frac{1}{\text{maxPts}} \left( dp[i] + dp[i+1] + \cdots + dp[i+\text{maxPts - 1}] \right) dp[i1]=maxPts1(dp[i]+dp[i+1]++dp[i+maxPts - 1])

t = m a x P t s t = maxPts t=maxPts, f [ i ] = f [ i + 1 ] × t + f [ i + 1 ] − f [ i + t + 1 ] t f[i] = \frac {f[i + 1] \times t + f[i + 1] - f[i + t + 1]}{t} f[i]=tf[i+1]×t+f[i+1]f[i+t+1], 整理后得到

f [ i ] = f [ i + 1 ] + f [ i + 1 ] − f [ i + t + 1 ] t f[i] = f[i + 1] + \frac {f[i + 1] - f[i + t + 1]} {t} f[i]=f[i+1]+tf[i+1]f[i+t+1]

这样就将时间复杂度降低到 O ( n ) O(n) O(n)

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>using namespace std;const int N = 2e4 + 10;class Solution {
public:double new21Game(int n, int k, int maxPts) {if (k == 0) return 1.0;//当前分数是i, 并且分数不超过n的概率double f[N] = {0};for (int i = k; i <= n && i < k + maxPts; ++i) f[i] = 1.0;//计算当前分数是i再抽一张牌, 得分不超过n的概率f[k - 1] = 1.0 * min(n - k + 1, maxPts) / maxPts;for (int i = k - 2; i >= 0; --i) {f[i] = f[i + 1] + (f[i + 1] - f[i + maxPts + 1]) / maxPts;}return f[0];}
};
http://www.xdnf.cn/news/2416.html

相关文章:

  • GRS认证审核内容?GRS认证基本概述?GRS认证的好处?
  • 【应用密码学】实验二 分组密码(2)
  • 「浏览器即OS」:WebVM技术栈如何用Wasm字节码重构冯·诺依曼体系?
  • 革新桌面自动化:微软UFO²操作系统深度解析与未来展望
  • C++笔记-模板进阶和继承(上)
  • 最佳实践-HENGSHI SENSE 可视化创作中如何引入数据集市的成果
  • 企业数据赋能 | 应用模板分享:汽车销售仪表板
  • Ubuntu下MySQL的安装
  • 前端高频面试题day2
  • 【MySQL】表的CRUD
  • 第1讲、#PyTorch教学环境搭建与Tensor基础操作详解
  • 计算机网络学习笔记 4-6章
  • 量子网络:构建未来通信的超高速“高速公路”
  • css面板视觉高度
  • 爬虫技术入门:基本原理、数据抓取与动态页面处理
  • Git 全面解析:从核心概念到生态应用
  • setup和hold互卡问题剖析
  • 【NVM】管理不同版本的node.js
  • AOSP Android14 Launcher3——动画核心类QuickstepTransitionManager详解
  • Animate 中HTMLCanvas 画布下实现拖拽、释放、吸附的拼图游戏
  • Shell脚本-until语法结构
  • 哈希封装unordered_map和unordered_set的模拟实现
  • 纯净IP的优势:稳定性与安全性的结合
  • Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit
  • FISCO BCOS 智能合约开发详解
  • Unreal Engine 实现软件测试方案的仿真体验
  • Nacos简介—4.Nacos架构和原理三
  • 如何排查服务器中存在的后门程序
  • 基于RuoYi的WMS仓库管理系统源码级解决方案
  • SQL 处理重复数据之技巧(Techniques for Handling Duplicate Data with SQL)