热门标签 | HotTags
当前位置:  开发笔记 > 开放平台 > 正文

SGU495KidsandPrizes概率DP,期望公式

题目这题目首先进去以后,没地方提交,第一次做SGU的题目,只能在HUSTOJ上提交了有n个盒子,里面有礼物的,m个人,每个人拿,拿过以后把礼物取出来把盒子放回去,求选中礼物数的期望其实一开始就假设方程dp[i]为第i个人获得礼物的概率,但是状态转移方程不知道该怎么办,想了很久都没有办法,其实首先边界为dp[1]

题目

这题目首先进去以后,没地方提交,第一次做SGU的题目,只能在HUSTOJ上提交了

有n个盒子,里面有礼物的,m个人,每个人拿,拿过以后 把礼物取出来 把盒子放回去,求选中礼物数的期望

其实一开始就假设方程 dp[i]为 第i个人获得礼物的概率,但是状态转移方程不知道该怎么办,想了很久都没有办法,

其实首先边界为dp[1] = 1 第一个上来选的人肯定必中

接下来一个人的 则由两部分组成,dp[i] = (1 - dp[i - 1]) * dp[i - 1] + .........,因为上一个人若没有选中,那么这一次选中的概率跟是上一个一样的,那么如果上一个人选中了呢,真的是想了好久好久啊,可是没有思路,,最后没办法,看了别的博客,那个人用了一个公式的方法做的,但是我觉得概率DP可以推的,看他介绍,一开始就强调了m个人选礼物是相互独立的事件,呃,这时候我有点开窍了,概率论学了很久了,有点忘了,每一次当一个礼物被选走的时候,人们选中礼物的概率都会减少1/n,这么说吧,我的理解是一开始选就是n个里面选一个,再后来少了一个礼物,那选中的概率就少了1/n,比如一开始有五个礼物,那么一开始选中的的概率为1,第二次按照我所想就是4/5,实际上确实 是只剩下四个礼物了,但是空盒子还是有一个的,所以一个人选中的概率为4/5,前面做多了,后来我一直以为是1/4,忘了总体,前面人选走礼物 对于这次 你的选择没有影响,因为你还是在那么多盒子里选,总得选得范围并没有发生变化,那么这样方程另一部分就出来了

dp[i] = (1 - dp[i - 1]) * dp[i - 1] + dp[i - 1] * (dp[i - 1] - 1/n)//对这个有点疑问的,题目没说n比m大,万一n比m小,一直减,会不会为负?

应该是我想多了,后面被拿完了礼物,那么一直都是0了,就算是负的乘以0也是一样的

那么这样m个人每个人 获得礼物的概率都求出来了,如何求期望呢?哈哈真的不会唉,概率忘光了...我当时的想法就是 每个人的概率乘以1然后累加,尝试了案例是对了,交了以后就过了。。。到底是为什么捏,看了别人博客都没有给出解释。。。百度了一会独立事件的期望,有个n * p的我都知道的方法,还发现了一个二项分布的计算方法,这个我是忘了,但是稍微画了一会,发现 跟这道题还是没有联系上,路过的巨巨 请给个解释,太晚了,明天自己再研究研究


int n,m;

double dp[100000 + 55];

void init() {

}

bool input() {
	while(cin>>n>>m) {

		return false;
	}
	return true;
}

void cal() {
	dp[1] = 1.00;
	for(int i=2;i<=m;i++)
		dp[i] = dp[i - 1] * (dp[i - 1] - 1.00/n*1.0) + dp[i - 1] * (1 - dp[i - 1]);
	double ans = 0.00;
	for(int i=1;i<=m;i++)
		ans += dp[i] * 1.00;
	printf("%.10lf\n",ans);
}

void output() {

}

int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}


哎呀,写完题解以后,走之前又手贱的试了一把,嗯发现这样也是可以的,就是每一步都加一个步数1,跟以前图里走步数其实是一样的,因为dp[i]代表的是选中的概率,那么肯定是选中的,所以加1就没问题了,那么加1状态方程就变成了,dp[i]代表的是前i个人选&#31036;物数目的期望,直到dp[m]就是答案,但是这样其它方向一想有点问题了,这样不是m步了吗?跟&#31036;物数什么联系呢?其实没事,如果n大于m,那么其实你最多选m个&#31036;物,如果n小于m,那么后来的概率是有为0的,所以你这样加上去,在下一步的乘法又变成了0,乱七八糟,否定自己以后又肯定自己,呵呵,好烦啊,睡觉去了。。。


int n,m;

double dp[100000 + 55];

void init() {

}

bool input() {
	while(cin>>n>>m) {

		return false;
	}
	return true;
}

void cal() {
	dp[1] = 1.00;
	for(int i=2;i<=m;i++)
		dp[i] = dp[i - 1] * (dp[i - 1] - 1.00/n*1.0) + dp[i - 1] * (1 - dp[i - 1]) + 1;
	//double ans = 0.00;
	//for(int i=1;i<=m;i++)
	//	ans += dp[i] * 1.00;
	printf("%.10lf\n",dp[m]);
}

void output() {

}

int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}



而后对于公式的产生了兴趣,独立事件期望有种N * P的 一种,反过来想,从&#31036;物考虑,每个&#31036;物不被选中的概率为(n - 1)/n,那么n个&#31036;物都不被选中的概率咱就不用多说了把

最后n个&#31036;物都不被选中的期望为 n *( (n - 1)/n)^m,

那么选中&#31036;物 的 期望为n -  n *( (n - 1)/n)^m,哈哈,跪了,啥好都不如数学好啊,想了那么久,人家一句话 简单概率期望公式 就解决了,呵呵


int n,m;

double dp[100000 + 55];

void init() {

}

bool input() {
	while(cin>>n>>m) {

		return false;
	}
	return true;
}

void cal() {
	double ans = n * 1.00;
	double tmp = 1.00;
	for(int i=1;i<=m;i++) {
		tmp *= (n - 1)*1.0/n*1.0;
	}
	ans = ans - n * tmp;
	printf("%.10lf\n",ans);
}

void output() {

}

int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}



推荐阅读
  • 本文将详细介绍如何配置JDK 8u101的环境变量,包括下载、安装和环境变量的设置步骤。适用于64位和32位操作系统。 ... [详细]
  • 2023年最新Linux环境下Android开发环境搭建指南
    2023年最新Linux环境下Android开发环境搭建指南,帮助Android开发者在Linux系统上快速搭建开发环境,解决常见的配置问题。 ... [详细]
  • 随着SEO技术的发展,越来越多的企业和个人开始重视网络营销。然而,要让网站在搜索引擎中获得良好的排名,不仅需要提升网站内容的质量,还需要构建高质量的外部链接。本文将详细介绍什么是高质量的外部链接以及如何有效构建这些链接。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • iOS 百度地图使用指南:基本定位与地理编码
    本文详细介绍如何在 iOS 应用中集成百度地图,实现基本的地图定位和地理编码功能。配置详情请参考官方文档:http://developer.baidu.com/map/index.php?title=iossdk ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 今日深入研究了树状数组,感觉难度较大,通过课件和博客辅助学习,仍有许多疑惑。主要探讨了老师推荐的三道题目,初步掌握了树状数组的基本用法。同时,还学习了逆序数和离散化的概念及其应用。 ... [详细]
  • 如何安装百度日语输入法?详细步骤指南
    随着互联网的快速发展,越来越多的人受到日本二次元文化的影响,开始学习和使用日语。百度日语输入法是一款非常实用的学习工具,本文将详细介绍其安装方法,帮助你轻松上手。 ... [详细]
  • 年前,我发表了一篇文章,分享了自己通过在线教育平台学习IT技能的经历。文中详细探讨了在线教育与传统线下教育在技能培训方面的优缺点。许多网友在讨论在线教育时,常常提到“在线教育是否缺乏学习氛围”的问题。本文将对此进行深入分析。 ... [详细]
  • 高效重装Windows 10系统指南
    如何快速地为您的电脑重装Windows 10系统?本文将详细介绍从下载系统镜像到安装完成的每一步操作。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 分享两个GitHub链接,今天看到的,超赞超赞不能更赞了,答应我一定要去看好吗~~~~不论是笔记还是github中分享的其它资源ÿ ... [详细]
  • 本文介绍了Go语言中正则表达式的基本使用方法,并提供了一些实用的示例代码。 ... [详细]
  • 题目链接: L - Floating-Point Numbers。题目要求处理带有15位小数的浮点数,计算其二进制表示的最大位数。 ... [详细]
author-avatar
键盘上的泪g_752
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有