【概率与统计 动态规划】 808. 分汤

news2024/11/27 12:57:56

本文涉及知识点

C++动态规划
数学 概率与统计

LeetCode 808. 分汤

有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作:
提供 100ml 的 汤A 和 0ml 的 汤B 。
提供 75ml 的 汤A 和 25ml 的 汤B 。
提供 50ml 的 汤A 和 50ml 的 汤B 。
提供 25ml 的 汤A 和 75ml 的 汤B 。
当我们把汤分配给某人之后,汤就没有了。每个回合,我们将从四种概率同为 0.25 的操作中进行分配选择。如果汤的剩余量不足以完成某次操作,我们将尽可能分配。当两种类型的汤都分配完时,停止操作。
注意 不存在先分配 100 ml 汤B 的操作。
需要返回的值: 汤A 先分配完的概率 + 汤A和汤B 同时分配完的概率 / 2。返回值在正确答案 10-5 的范围内将被认为是正确的。
示例 1:
输入: n = 50
输出: 0.62500
解释:如果我们选择前两个操作,A 首先将变为空。
对于第三个操作,A 和 B 会同时变为空。
对于第四个操作,B 首先将变为空。
所以 A 变为空的总概率加上 A 和 B 同时变为空的概率的一半是 0.25 *(1 + 1 + 0.5 + 0)= 0.625。
示例 2:
输入: n = 100
输出: 0.71875
提示:
0 <= n <= 109

动态规划

当n较小时,通过动态规划求解。当n 较大时结果大于0.99999​​​​​​​,忽略误差后就是1。
由于都是25倍数,所有n = n/25+(0 != n%25)

动态规划的状态表示

dp[i][j] 表示i单位的汤A,j单位的汤B 的概率。
空间复杂度:O(nn)

状态规划的状态表示

每种状态分别枚举4种可能并除以4。

动态规划的初始值

dp[0][0] = 0.5。

动态规划的填表顺序

i,j从小到。 每种分配 A汤一定变少。

动态规划的翻转

dp[n][n]

注意:

n可以为0。

代码

核心代码

class Solution {
public:
	double soupServings(int n) {
		n = (n+24)/25;
		if (n > 1000) { return 1; }
		vector<vector<double>> dp(n + 1, vector<double>(n + 1,0.5));	
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				double sum = 0;
				for (int k = 4; k >= 1; k--)
				{
					const int i1 = max(0, i - k);
					const int i2 = max(0, j - (4 - k));
					if ((0 == i1) && (0 == i2)) 
					{ sum += 0.5; 
					}
					else if (0 == i1) {
						sum += 1;
					}
					else if (0 == i2) {

					}
					else {
						sum += dp[i1][i2];
					}					
				}
				dp[i][j] = sum / 4;
			}
		}
		return dp.back().back();
	}
};

单元测试

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;
	TEST_CLASS(UnitTest)
	{
	public:
		TEST_METHOD(TestMethod00)
		{
			n = 50;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod01)
		{
			n = 100;
			auto res = Solution().soupServings(n);
			AssertEx(0.71875, res);
		}
		TEST_METHOD(TestMethod02)
		{
			n = 1;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod03)
		{
			n = 2;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod04)
		{
			n =3;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod05)
		{
			n = 4;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod06)
		{
			n = 5;
			auto res = Solution().soupServings(n);
			AssertEx(0.62500, res);
		}
		TEST_METHOD(TestMethod07)
		{
			n = 0;
			auto res = Solution().soupServings(n);
			AssertEx(0.5, 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/2100049.html

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

相关文章

Chapter 10 async函数 await关键字

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、async 函数二、await 关键字 前言 在现代 JavaScript 开发中&#xff0c;异步编程是一个重要的概念。随着 ES2017 的引入&#xff0c;async 函数和 await 关键字为处…

一文读懂Mysql连接数的基本知识

目录 前言1. 基本知识2. 常用命令 前言 原先写过一篇SQL Server的知识点&#xff0c;推荐阅读&#xff1a;Sql Server缓冲池、连接池等基本知识&#xff08;附Demo&#xff09; 其余知识点推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&…

Windows10上Nginx如何通过自签名证书方式发布Https服务(上)

背景 在Android开发中使用平板设备进行调试,Android版本是13。在调试中遇到一个这样的报错信息:“java.io.IOException: Cleartext HTTP traffic to 192.168.137.1 not permitted”,然后查了下报错原因是:应用正在尝试通过不安全的HTTP协议进行网络通信,而你的应用运行的环…

计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程

一、前言 计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程 【特别说明&#xff1a;下载的文件为压缩包文件&#xff0c;右键 解压到当前文件夹&#xff0c;将解压后 的文件夹复制到电脑的D盘或E盘&#xff0c;打开该文件夹&#xff0c;将程序图…

竞品分析文档——word版

今天和大家免费分享产品必备文档模板——竞品分析文档&#xff08;word&#xff09;&#xff0c;包括一下部分内容&#xff1a; 1、竞品概述——基本信息、竞品目的、发展历程、产品定位、商业模式 2、市场分析——发展背景、发展现状、流量分析 3、用户分析——用户画像、用…

如何使用Windows自带的软件进行扫描

我们在使用电脑办公的时候&#xff0c;可能会需要进行文件的扫描。有的小伙伴在扫描的过程中可能会出现一些问题&#xff0c;明明扫描仪已经安装了&#xff0c;但是又不知道Windows扫描仪程序在哪里怎么启动&#xff1b;那么今天就跟大家分享一下Windows扫描仪程序在哪里&#…

uniapp插槽用法

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中&#xff0c;插槽&#xff08;Slot&#xff09;是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…

安科瑞DJSF1352型电子式直流电能表 CE/UL等资质认证

产品概述 DJSF1352型电子式直流电能表采用液品显示&#xff0c;具有RS485功能可与微机进行数据交换。适合充电桩直流计量、电池、太阳能电池板等直流信号设备电量测量和电能计量使用&#xff0c;亦可用于工矿企业&#xff0c;民用建筑&#xff0c;楼宇自动化等现代供配直…

JeecgBoot积木报表AviatorScript表达式注入漏洞复现

文章目录 漏洞信息漏洞复现环境搭建poc复现DNSLog验证 漏洞信息 影响组件&#xff1a;JimuReport积木报表 影响版本&#xff1a;v1.6.0 &#xff1c; JimuReport ≤ 1.7.8 漏洞名称&#xff1a;AviatorScript表达式注入漏洞 漏洞链接&#xff1a;积木报表软件存在AviatorSc…

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration)

强化学习实践&#xff08;二&#xff09;&#xff1a;Dynamic Programming&#xff08;Value \ Policy Iteration&#xff09; 伪代码Value IterationPolicy IterationTruncated Policy Iteration 代码项目地址 伪代码 具体的理解可以看理论学习篇&#xff0c;以及代码中的注释…

Shader学习笔记

1. 渲染管线概述 定义&#xff1a;渲染管线&#xff08;流水线&#xff09;就是将数据分阶段的变为屏幕图像的过程 数据就是我们在游戏场景中放置的模型、光源、摄像机等等内容的数据 阶段就是渲染管线中的三个阶段&#xff1a;应用阶段一>几何阶段一>光栅化阶段 通过这…

超详细步骤——Keil MDK-ARM 如何修改工程名字

背景&#xff1a; 注意&#xff1a;本项目是基于 STM32 单片机的裸机程序&#xff0c;使用 STM32CubeMX 工具生成的 Keil MDK-ARM 工程。 目标&#xff1a; 在 Keil MDK-ARM 开发环境中&#xff0c;将名为version0805 的工程重命名为 version0910&#xff0c;并确保所有新编译…

PHP+Thinkphp+MySQL民宿管理系统41279-计算机毕业设计项目选题推荐(免费领源码)

摘 要 伴随着国内旅游经济的迅猛发展民宿住宿行在国内也迎来了前所未有的发展机遇。传统的旅游模式已难以满足游客日益多元化的需求&#xff0c;随着人们外出度假的时间越来越长&#xff0c;导致人们在住宿的选择上更加追求舒适、个性化的住宿体验。以往大家出游度假首选都是以…

Android图片缓存工具类LruCache原理和使用介绍

LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络&#xff0c;其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用&#xff0c;意思是当缓存到达限制时候&#xff0c;优先淘汰近 期内最少使用的缓存&#xff0c…

传输层协议---TCP协议

以下都是自己的学习总结&#xff0c;有不足也有错误的地方&#xff0c;谨供参考。 TCP协议特点 ---面向字节流&#xff0c;有连接&#xff0c;可靠&#xff0c;全双工 面向字节流 面向字节流指的是服务器和客户端之间的数据传输&#xff0c;使用的字节流传输&#xff0c;获取…

Git 使用指南 --- 远程仓库

序言 在这篇文章中&#xff0c;我们将理解分布式版本控制系统&#xff0c;学习远程仓库与本地仓库的交互操作&#xff0c;掌握多⼈协作开发模式。 1. 理解分布式版本控制系统 前两篇中的所有内容都是针对于在本地的文件管理&#xff0c;Git 的强大之处肯定不仅仅只是体现于此。…

jupter_notebook简单介绍以及安装使用

目录 jupyter简单介绍&#xff1a; Jupyter&#xff1a; Jupyter的主要特点包括&#xff1a; 1. 交互式编程&#xff1a; 2. 文档和代码的整合&#xff1a; 3. 易于分享和协作&#xff1a; 4. 丰富的扩展性&#xff1a; 5. 社区支持&#xff1a; 6. 支持多种内核&#…

基于SpringBoot房屋租赁管理系统【包含运行步骤】

基于SpringBoot房屋租赁管理系统【包含运行步骤】 一、项目简介二、技术选型三、运行步骤1. 项目启动 四、项目演示前台页面展示管理员后台管理源码获取方式 总结 大家好&#xff0c;这里是程序猿代码之路&#xff0c;在当今社会&#xff0c;随着城市化进程的加快&#xff0c;房…

Git之2.29版本重要特性及用法实例(六十二)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列…

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大。下面是一些介绍: 台灣億圖 HUST CNC 是一個充滿活力的公司,我們經營的目標是提供能滿足客戶之優良產品,以及優質的服務。我們的期望是使 HUS…