Leetcode837.新21点

目录

      • 题目
      • [算法标签: 数学, 概率, 动态规划](#算法标签: 数学, 概率, 动态规划)
      • 思路
      • 代码

题目

837. 新 21 点

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

思路

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

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

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

d p i − 1 = 1 maxPts ( d p i + d p i + 1 + ⋯ + d p i + maxPts - 1 ) dpi - 1 = \frac{1}{\text{maxPts}} \left( dpi + dpi+1 + \cdots + dpi+\\text{maxPts - 1} \right) dpi−1=maxPts1(dpi+dpi+1+⋯+dpi+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 fi = \frac {fi + 1 \times t + fi + 1 - fi + t + 1}{t} fi=tfi+1×t+fi+1−fi+t+1, 整理后得到

f i = f i + 1 + f i + 1 − f i + t + 1 t fi = fi + 1 + \frac {fi + 1 - fi + t + 1} {t} fi=fi+1+tfi+1−fi+t+1

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

代码

cpp 复制代码
#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];
    }
};
相关推荐
白狐_7986 分钟前
408 数据结构|KMP做题方法:next、nextval和高频易错点
数据结构·算法
月华路9 分钟前
《模型不玄学》第20章 两种评估视角
人工智能·算法·机器学习
禹凕32 分钟前
快速幂算法详解与实战
python·算法
知产xiao_xin34 分钟前
《伯尔尼公约》适用的特殊情形
经验分享·笔记·知识产权
xxwl58536 分钟前
高斯消元法异或版
人工智能·算法·机器学习
sylviiiiiia41 分钟前
leetcode hot 100
python·算法·leetcode
励志不掉头发的内向程序员1 小时前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
OPEN-F1 小时前
ROS2系列教程:Gazebo插件(关节控制/IMU/激光雷达)
c++·python·数码相机·算法·机器人
luj_17681 小时前
虚实交融中的真实人物塑造
c语言·开发语言·网络·经验分享·算法
蒸蒸yyyyzwd1 小时前
cpp 选手秋招学习笔记 day27
服务器·c++·面试·八股