【动态规划 逆向】837. 新 21 点

news2024/11/15 14:22:11

本文涉及知识点

C++动态规划

LeetCode837. 新 21 点

爱丽丝参与一个大致基于纸牌游戏 “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[i] 表示抽取i的可能数。空间复杂度:O(n+maxPts)

动态规划的状态方程

枚举后置状态,每种后置状态枚举最后一次抽取的数字。
dp[i] += F o r j : 1 m a x P t s d p [ i − k ] For_{j:1}^{maxPts}dp[i-k] Forj:1maxPtsdp[ik] st i-k < n
用前缀和或滑动窗口,单个状态转移的时间复杂度为:O(1)
故总时间复杂度为:O(n+maxPts)

动态规划的初始值

dp[0]为0

动态规划的填表顺序

从1到n-1+maxPts

动态规划的返回值

sum(dp[1…k-1])/sum(dp[1…])

此题歧义

如:k=3 n = 3 maxPts=2 ,共有五种可能111 112 12 21 22
dp[3]=3 dp[4]=2,故概率应该是0.6
答案是:0.625

我的代码

class Solution {
public:
	double new21Game(int n, int k, int maxPts) {
		vector<long long> dp (k + maxPts);
		dp[0] = 1;
		vector<long long> preSum = { 0,1 };
		for (int i = 1; i < k + maxPts; i++) {
			int begin = max(i - maxPts,0);
			dp[i] = preSum.back() - preSum[begin];
			if (i < k) {
				preSum.emplace_back(preSum.back() + dp[i]);
			}			
		}
		auto sum1 = accumulate(dp.begin()+k , dp.begin() + n+1,0.0);
		auto sum2 = accumulate(dp.begin()+k, dp.end(), 0.0);
		return sum1 / sum2;
	}
};

官方的解法

dp[4] 无法继续 必定超n,故0
dp[3] 无法继续 几率1
dp[2] 可能是1或2,则结果是(dp[3]+dp[4])/2 = 0.5
dp[1]可能是1或2 ,则结果是0.75
dp[0]是0.625

动态规划的状态表示

dp[x]表示已经x分后,不超的记录。

动态规划的转移方程。

{ 0 ( x > = k ) 且 ( x > n ) 1 ( x > = k ) 且 ( x < n ) ( ∑ j : x + 1 m d p [ j ] ) / ( m − x ) 其中 m = m i n ( k − 1 + m a x P t s , x + m a x P t s ) o t h e r \begin{cases} 0 && (x >= k ) 且 (x > n )\\ 1 && ( x>=k )且(x < n ) \\ (\sum_{j:x+1}^{m}dp[j] )/(m-x) 其中 m = min(k-1+maxPts,x+maxPts) && other\\ \end{cases} 01(j:x+1mdp[j])/(mx)其中m=min(k1+maxPts,x+maxPts)(x>=k)(x>n)(x>=k)(x<n)other

动态规划的填表顺序

i = k-1 : 0

动态规划的初始值

初始化x >= k

动态规划的返回值

dp[0]

代码

class Solution {
public:
	double new21Game(int n, int k, int maxPts) {
		vector<double> dp (k + maxPts);
		double sum = 0;
		for (int i = k; i <= min(n,(int)dp.size()-1); i++) {
			dp[i] = 1;
			sum++;
		}		
		for (int i = k - 1; i >= 0; i--) {
			const int m = min(k - 1 + maxPts, i + maxPts);
			if (m + 1 < dp.size()) {
				sum -= dp[m + 1];
			}
			dp[i] = sum / (m - i);
			sum += dp[i];
		}
		return dp[0];
	}
};

单元测试


template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{
	Assert::AreEqual(t1, t2);
}
void AssertEx( double t1,  double t2)
{
	auto str = std::to_wstring(t1) + std::wstring(1,32) + std::to_wstring(t2);
	Assert::IsTrue(abs(t1 - t2) < 1e-5,str.c_str() );
}

template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{
	Assert::AreEqual(v1.size(), v2.size());
	for (int i = 0; i < v1.size(); i++)
	{
		Assert::AreEqual(v1[i], v2[i]);
	}
}

template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{
	sort(vv1.begin(), vv1.end());
	sort(vv2.begin(), vv2.end());
	Assert::AreEqual(vv1.size(), vv2.size());
	for (int i = 0; i < vv1.size(); i++)
	{
		AssertEx(vv1[i], vv2[i]);
	}
}

namespace UnitTest
{
	int n,  k,  maxPts;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod00)
		{
			n = 10, k = 1, maxPts = 10;
			auto res = Solution().new21Game(n, k, maxPts);
			AssertEx(1.0, res);
		}
		TEST_METHOD(TestMethod01)
		{
			n = 6, k = 1, maxPts = 10;
			auto res = Solution().new21Game(n, k, maxPts);
			AssertEx(0.6, res);
		}
		TEST_METHOD(TestMethod02)
		{
			n = 3, k = 3, maxPts = 2;
			auto res = Solution().new21Game(n, k, maxPts);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod03)
		{
			n = 1, k = 0, maxPts = 1;
			auto res = Solution().new21Game(n, k, maxPts);
			AssertEx(1.0, res);
		}
		TEST_METHOD(TestMethod04)
		{
			n = 21, k = 17, maxPts = 10;
			auto res = Solution().new21Game(n, k, maxPts);
			AssertEx(0.73278, res);
		}
	};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

常用的人力资源管理系统的价格是多少?

企业的发展实质上就是企业人才的发展&#xff0c;做好人才管理是企业稳步发展的重要手段。许多企业意识到这点也开始建立自己的人力资源管理体系&#xff0c;但往往被自己遇到的复杂事务性问题所束缚&#xff0c;无法深入的去做人力资源管理。随着互联网的发展&#xff0c;人力…

3个方法对症下药:iphone备忘录删了怎么恢复?

iPhone的备忘录应用为我们的生活提供了很多便利&#xff0c;我们可以使用备忘录来记录生活中重要的事项&#xff0c;如密码&#xff0c;行程、会议内容等。但是&#xff0c;如果这些备忘录的内容不小心删除了怎么办呢&#xff1f;今天这篇文章就是来解决大家关于iPhone备忘录删…

MATLAB智能优化算法-学习笔记(1)——遗传算法求解0-1背包问题【过程+代码】

一、问题描述 (1)数学模型 (2)模型总结 目标函数:最大化背包中的总价值 Z。约束条件:确保背包中的物品总重量不超过容量 W。决策变量:每个物品是否放入背包,用0或1表示。这个数学模型是一个典型的0-1整数线性规划问题。由于其NP完全性,当问题规模较大时,求解此问题通…

某投资集团数据采集分析项目:实施全过程解析

在数字化转型的浪潮中&#xff0c;某投资集团以前瞻性的视野&#xff0c;积极响应市场变化&#xff0c;致力于构建高效、智能的数据管理体系。面对海量、复杂且分散的投资经营数据&#xff0c;该集团勇于探索&#xff0c;通过一系列精心策划与高效执行&#xff0c;携手亿信华辰…

盘点国内外好用的10款文件加密软件:企业文件防泄密的最佳选择

随着企业数据安全的重要性日益增加&#xff0c;文件加密软件成为保护敏感信息、防止数据泄漏的关键工具。无论是保护内部文档、财务记录还是客户数据&#xff0c;选择合适的加密软件都是企业信息安全的基础。以下是国内外好用的10款文件加密软件推荐&#xff0c;帮助企业提升数…

ZBrush入门使用介绍——12、折边

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的功能。   如果拿一个立方体&#xff0c;进行CtrlD增加细分 会出现在边缘的线会被平滑的情况&#xff0c;这时候原来立方体的形状会发生一定的变化&#xff0c;不能保持原来的形状。 如果立方体真的只有8个顶点&#xff0…

关于怎么使用Charles

一、原理图二、Charles优点三、Charles组件介绍四、安装与使用1. 安装Charles2. Charles快速查找接口的四种技巧2.1 过滤1&#xff09;通过filter功能过滤2&#xff09;通过find功能过滤3&#xff09;通过Recording Settings功能过滤4&#xff09;通过Focus或Ignore聚焦或忽略指…

Stream DATA From openai GPT-3 API using php

题意&#xff1a;“使用 PHP 从 OpenAI GPT-3 API 流式传输数据” 问题背景&#xff1a; Im having trouble with the OpenAI API, Basically what Im trying to do is stream each data node that is streamed back from the openai API response and output each data node …

ModBus RTU、ModBus ASCII、ModBus TCP,它们有什么区别?

ModBus是一种通信协议&#xff0c;用于连接自动化设备&#xff08;如PLC、温度控制器等&#xff09;和计算机。它被广泛应用于工业控制系统&#xff0c;支持多种通信方式&#xff0c;包括ModBus RTU、ModBus ASCII和ModBus TCP 3种模式。 Modbus是一种应用层协议&#xff0c;它…

在线绘制甘特图!推荐这款白板绘图神器,职场办公必备!

在当今快节奏的现代职场中&#xff0c;高效的项目管理和任务规划至关重要。作为一种强大的可视化工具&#xff0c;甘特图在项目管理中扮演着不可或缺的角色。它能够直观地展示项目进度、任务分配和时间安排&#xff0c;帮助团队成员更好地理解和执行项目计划。 甘特图是什么意…

SQL血缘解析

Druid 作为使用率特别高的的数据库连接池工具,在具备完善的连接池管理功能外,同时Druid 的 SQL解析功能可以用来防止 SQL注入等安全风险。通过对 SQL 语句进行解析和检查,Druid 可以识别并阻止潜在的恶意 SQL 语句执行,黑名单(阻止特定的 SQL 语句执行)、白名单(仅允许特…

解决添加MPJ插件启动报错

在项目中需要用到多数据源的级联查询&#xff0c;所以引入了MPJ插件&#xff0c;MPJ的版本是1.2.4&#xff0c;MP的版本是3.5.3&#xff0c;但却在启动的时候报错&#xff0c;报错如下&#xff1a; 解决办法&#xff1a; 将MP的版本降到3.5.1

【苍穹外卖】Day1 环境搭建 接口文档

1 软件开发整体介绍 1.1 软件开发流程 | 需求分析 | 形成两个文档&#xff1a;需求规格说明书、产品原型 | 设计 | UI 设计、数据库设计、接口设计 | 编码 | 项目代码&#xff0c;单元测试 | 测试 | 测试用例、测试报告 | 运维 | 软件环境安装、配置 1.2 角色分工 1.3 软件…

企业开展TPM管理培训需要什么条件?

在探讨企业如何有效开展TPM管理培训时&#xff0c;我们不得不深入分析几个核心要素&#xff0c;这些要素构成了成功实施TPM管理培训的必要条件。TPM作为一 种追求生产系统效率最大化的现代管理理念&#xff0c;其成功推行不仅依赖于先进的技术手段&#xff0c;更离不开企业内部…

探索最佳数据恢复工具:为您的数据保驾护航

数据已成为我们日常工作和生活中不可或缺的部分,然而&#xff0c;数据丢失的意外却总是让人措手不及——无论是因误操作删除文件&#xff0c;抑或是因病毒攻击或硬件故障而丢失数据&#xff0c;这些情况都可能带来巨大的困扰。所幸&#xff0c;市场上有诸多功能强大的数据恢复工…

FSQ26信号分析仪RS FSU26 20HZ-26.5G频谱分析仪

罗德与施瓦茨Rohde & Schwarz FSQ26信号分析仪&#xff0c;20 Hz - 26.5 GHz ​R&S FSQ26 信号分析仪集两种仪器于一身。它提供高达 120 MHz 解调带宽的信号分析&#xff0c;并具有高端频谱分析仪的动态范围。 频率范围&#xff1a;20 Hz 至 26.5 GHz 高端频谱分析仪…

智慧公厕系统如何应对高峰期游客?

在旅游景区、繁华商圈等场所&#xff0c;高峰期游客的涌入常常给公共设施带来巨大压力&#xff0c;公厕便是其中之一。传统公厕在面对高峰期游客时往往捉襟见肘&#xff0c;出现排队过长、环境脏乱、设施故障等问题。然而&#xff0c;随着科技的不断进步&#xff0c;智慧公厕系…

如何使用ssm实现基于SSM的社区物业管理系统的设计与实现+vue

TOC ssm223基于SSM的社区物业管理系统的设计与实现vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&…

接口测试面试题及参考答案,轻松拿捏面试官

1、你们公司的接口测试流程是&#xff1f; 接口测试我们是在XX项目做的&#xff0c;主要有XX接口&#xff0c;XX接口&#xff0c;XX接口等。 1、首先是从开发那里拿到API接口文档&#xff0c;了解接口业务、包括接口地址、请求方式&#xff0c;入参、出参&#xff0c;token鉴…

【python】数据分析统计

逐行读取’\t’分割的txt 对其中的每个数值都转为六位小数的str 再存入dict 存到excel pip install pandas pip install openpyxl # 用于写入Excel文件import pandas as pd # 假设txt文件的路径是data.txt file_path data.txt # 用于存储数据的字典&#xff0c;假设每…