hdu 5570(数学期望)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5570

【分析】


用A[i][j]表示第i个球为颜色j的概率
用c[j]表示颜色为j的球的个数
用E[x]表示式子x的期望,显然有E[X[i][j]]=A[i][j]*1+(1-A[i][j])*0=A[i][j]
用P[x]表示事件x发生的概率
题目所要求的是E[c[1]^2 +c[2]^2 +c[3]^2+...+c[m]^2]
按照期望的线性相加特性,题目所求的就是∑(j=1~m)E[c[j]^2]=E[c[1]^2]+E[c[2]^2]+...+E[c[m]^2];


一上来就研究概率,思路很难入手,难度会大一点。
于是我们不妨对于一个单独的状态(就是每个小球的颜色都确定)做研究——
用X[i][j]表示第i个球是否为第j种颜色,如果是,X[i][j]为1;否则,X[i][j]为0。
那么,c[j]=X[1][j]+X[2][j]+...+X[n][j].
回到∑(j=1~m)E[c[j]^2],它便可以写成——
=∑(j=1~m)E[(X[1][j]+X[2][j]+...+X[n][j])^2]
对于元素个数的平方,如何考虑其叠加性质,从贡献上,通过加法来简化问题?
元素个数的平方,等于元素的pair数(pair自然也包括[自身,自身]这一个)。
于是,上式又可以化为——
=∑(for j=1~m--for p=1~n--for q=1~n)E[ X[p][j]*X[q][j] ]


我们上面研究的某一个状态下的答案。然而我们还需要把其转化为概率来思考。
然而,在尝试化简的时候,我们注意点:E[X[p][j] * X[q][j]](p!=q)和 E[X[p][j]* X[p][j]] 是不一样的
因为对于E[X[p][j] * X[q][j]]来说,并结合上面确定的E[X[i][j]]=A[i][j]——
如果p!=q,那么这两个随机变量互相独立=E[X[p][j]] * E[X[q][j]] =A[p][j]*A[q][j]
如果p==q,那么E[ X[p][j]*X[p][j] ]=E[X[p][j]]=A[p][j]


于是,对于这道题的答案,式子先变成了——
∑(for j=1~m)
{
∑(for p=1~n)
{
∑(for q=1~n&&q!=p){A[p][j]*A[q][j]}
+A[p][j]
}
}


再化简一下,最后的式子就是——
∑(for j=1~m)
{
( ∑(for i=1~n)A[i][j] )^2
-∑(for i=1~n)A[i][j]^2 //这个是( ∑(for i=1~n)A[i][j] )^2中多算的量,减掉。
+∑(for i=1~n)A[i][j] //这个是真正应该算入的量,加上去。
}
我们发现,这个复杂度确实只有O(nm),这道题就做完啦~~


【时间复杂度&&优化】

O(nm)


参考博客:http://blog.csdn.net/snowy_smile/article/details/50032485

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 1005;
int n,m;
double p[maxn][maxn];

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i = 1; i <= n; i++)
		{
			double sum = 0;
			for(int j = 1; j <= m; j++)
			{
				scanf("%lf",&p[i][j]);
				sum += p[i][j];
			}
			for(int j = 1; j <= m; j++)
				p[i][j] = p[i][j] / sum;
		}
		double ans = 0;
		for(int i = 1; i <= m; i++)
		{
			double tmp = 0;
			for(int j = 1; j <= n; j++)
				tmp += p[j][i];
			tmp = tmp * tmp;
			for(int j = 1; j <= n; j++)
				tmp -= p[j][i] * p[j][i];
			for(int j = 1; j <= n; j++)
				tmp += p[j][i];
			ans += tmp;
		}
		printf("%.2f\n",ans);
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值