POJ2151Check the difficulty of problems 概率DP

简介:
概率DP,还是有点恶心的哈,这道题目真是绕,问你T个队伍。m个题目。每一个队伍做出哪道题的概率都给了。冠军队伍至少也解除n道题目,全部队伍都要出题,问你概率为多少?

一開始感觉是个二维的,然后推啊推啊没有推出来,一開始觉得冠军队伍仅仅能有一个。所以必须控制一个队伍解题数比其他队伍多,并且这个冠军队伍解题数必须大于等于n。大于n的时候其他队伍解题数就非常难了,直到坑到最后才发现 原来能够非常多队伍都是冠军,大家都是十道 那么大家都是冠军。…………

然后还是继续推二维,结果还是没想出。看来不是先如果方程才好做的,先整体来考虑,全部队伍出题概率,就是1 -减去没出题的概率。没出题的概率非常easy的,每一个队伍每道题都做不出 的概率累乘就能够了。那么冠军队伍至少出n道要怎么求呢,想了半天也没想好。后来发现直接 出题的概率 减去 每一个队伍出题数目是在 1到n-1之间的概率累乘。 就能够了,为什么呢?首先每一个队伍都出题这个条件已经满足了,剩下的反过来想。如果每一个队伍出题数都在1到n-1之间那么 就不符合题目要求了。那么减去这部分答案就能够了,这样想就简单点了

后来还是想推二维。发现想不出来,最后推了一个三维的 

dp[i][j][k]代表第i仅仅队伍前j道题解出了k道

边界dp[i][0][0] = 1,能够这么理解,前0道题目除了0道题目 这是肯定的 所以概率为1


后来不服。又强行推了一个二维的,如果好方程以后发现 跟三维的意义一样嘛,看来还是要先主要的弄清楚了才干够
先贴个三维的

 
int m,t,n;

double mp[1000 + 55][50 + 55];

double dp[1000 + 55][30 + 5][30 + 5];//dp[i][j][k]第i队前j道题做出k道


void init() {
	memset(mp,0.00,sizeof(mp));
	memset(dp,0.00,sizeof(dp));
}

bool input() {
	while(cin>>m>>t>>n,n + m + t) {
		for(int i=1;i<=t;i++)
			for(int j=1;j<=m;j++)
				cin>>mp[i][j];
		return false;
	}
	return true;
}

void cal() {
	for(int i=1;i<=t;i++) {//边界处理
		dp[i][0][0] = 1.00;
		for(int j=1;j<=m;j++) 
			dp[i][j][0] = dp[i][j - 1][0] * (1 - mp[i][j]);
	}
	for(int i=1;i<=t;i++) {
		for(int j=1;j<=m;j++) {
			for(int k=1;k<=j;k++)
				dp[i][j][k] = dp[i][j - 1][k - 1] * mp[i][j] + dp[i][j - 1][k] * (1 - mp[i][j]);
		}
	}
	double qq = 1.00;
	for(int i=1;i<=t;i++)qq *= (1 - dp[i][m][0]);//dp[i][m][0]表示i队一道题都没做出。减去就是出题了
	double pp = 1.00;
	double tmp = 0.00;
	for(int i=1;i<=t;i++) {
		tmp = 0.00;
		for(int k=1;k<=n - 1;k++)tmp += dp[i][m][k];//i队出了1道,2道……(n - 1)道的概率
		pp *= tmp;
	}
	double ans = qq - pp;
	printf("%.3lf\n",ans);
}

void output() {

}

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

二维的。事实上没什么差别:
 
int m,t,n;

double mp[1000 + 55][50 + 55];

double dp[30 + 5][30 + 5];//dp[j][k]前j道题做出k道


void init() {
	memset(mp,0.00,sizeof(mp));
	memset(dp,0.00,sizeof(dp));
}

bool input() {
	while(cin>>m>>t>>n,n + m + t) {
		for(int i=1;i<=t;i++)
			for(int j=1;j<=m;j++)
				cin>>mp[i][j];
		return false;
	}
	return true;
}

void cal() {
	dp[0][0] = 1.00;
	double qq = 1.00;
	double pp = 1.00;
	for(int i=1;i<=t;i++) {
	for(int j=1;j<=m;j++)
		dp[j][0] = dp[j - 1][0] * (1 - mp[i][j]);
		for(int j=1;j<=m;j++) {
			for(int k=1;k<=m;k++) {
				dp[j][k] = dp[j - 1][k] * (1 - mp[i][j]) + dp[j - 1][k - 1] * mp[i][j];
			}
		}
		qq *= (1 - dp[m][0]);//当前队伍出题的概率,全部队伍累乘
		double tmp = 0.00;
		for(int k=1;k<=n - 1;k++)tmp += dp[m][k];//当前队伍出题数目在[1,n)之间的概率
		pp *= tmp;//全部队伍要累乘
	}
	double ans = qq - pp;//减减就是答案
	printf("%.3lf\n",ans);
}

void output() {

}

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






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5252724.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
56
分享
相关文章
|
7月前
|
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
551 61
自动化微信朋友圈:Python脚本实现自动发布动态
什么是 CSS Modules ?我们为什么需要它们
CSS Modules 是一种将 CSS 与模块系统结合的技术,通过局部作用域和模块隔离,解决了传统 CSS 全局样式污染的问题。本文介绍了 CSS Modules 的基本概念、主要特点及其优势,包括自动生成唯一类名、提高代码可维护性和可读性、支持动态样式和主题切换等,并提供了 React 中的使用示例。
375 6
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
DNS服务器加密传输
【8月更文挑战第18天】
1284 15
|
11月前
|
【计算机三级数据库技术】第9章 数据库的安全管理--附思维导图
文章提供了数据库安全管理的全面指南,涵盖了安全控制、存取控制、审计跟踪以及SQL Server和Oracle数据库的安全控制方法。
138 0
「微服务」这10道Consul面试题值得一看
Consul 是一个强大的分布式服务发现和配置管理工具,用于服务注册、健康检查、负载均衡、故障恢复等。它支持多数据中心和多种协议,提供服务发现、健康检查、KV 存储和事件通知功能。服务注册与健康检查由 Agent 实现,负载均衡通过 Service Mesh 实现。尽管 Consul 提供诸多优点,如多数据中心支持和高可用性,但其学习和部署成本较高,适合大型项目,对于小型或初学者可能过于复杂。在使用时需根据实际需求和资源考虑。
162 3
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
241 2
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
【支付宝商家助手】正式上线——随时随地移动管理 助力经营
446 11
Python 基于微博舆情分析系统的设计与实现,GUI可视化界面(毕业设计,附源码,教程)
Python 基于微博舆情分析系统的设计与实现,GUI可视化界面(毕业设计,附源码,教程)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问