codeforces 概率期望

概率dp:

1:一般dp[i][j][k]表示这种状态的概率,然后利用填表法或者刷表法转移;

2:一般初始状态(末尾状态)只能有一个,末尾状态(初始状态)如果有多个要考虑将所有的概率加(取max)起来;

codeforces 442B 概率+贪心

题意:有n个人,每个人可以提出一个问题,提出问题的成功率为a[i],现在要求这n个人总共成功提出一个问题的成功率;

思路:假设 p1 p2 p3  p20.5时,不选任何人最好,将a排序,然后贪心的选人就行;ac代码 https://codeforces.com/contest/442/submission/61826973

codeforces 515D 概率dp

题意:有n个人的队列,t秒钟,现在给你每秒钟队头那个人上电梯的概率,求t秒钟后,在电梯上人的数量的期望,

思路:概率dp,dp[i][j]表示在i秒钟,j个人在电梯上的概率,dp[0][0]=1;  

那么分三种情况 当j==0  dp[i][0]=dp[i-1][0]*(1-p)既每次都失败

当j==n时  dp[i][j]=dp[i-1][j-1]*p+dp[i-1][j]    既在第i秒有人成功上电梯,加上在前i-1秒已经有j人上电梯,第i秒一定有j人在电梯上

其它情况  dp[i][j]=dp[i-1][j-1]*p+dp[i-1][j]*(1-p);    这个就不需要解释了 

ac代码:https://codeforces.com/contest/518/submission/61834340

codeforces 148D 概率dp

题意:有二人玩游戏,一个箱子里有w个白球,b个黑球,他们二个人每次轮流取球,先手每次取一个球,后手每次取二个球,如果先手取到白球,先手胜,如果后手第一次取到的球是白球,后手胜,求先手胜的概率

思路:dp[i][j][0]表示当箱子里面的白球是i个,黑球是j个,轮到先手取球,这个时候是这种状态的概率,dp[w][b][0]=1 ,其它为0;

每次先手取球时 ans+=dp[i][j][0]*  i/(i+j);    模拟一下很好写出方程;

dp[i][j-1][1]+=dp[i][j][0]*j/(i+j);           //没抽到w 
ans+=1.0*i/(i+j)*dp[i][j][0];                    //抽到w 
dp[i][j-2][0]+=dp[i][j][1]*j/(i+j)*(j-1)/(i+j-1);// 抽到b且跑了b  //后手只能抽到b才能继续游戏
dp[i-1][j-1][0]+=dp[i][j][1]*j/(i+j)*i/(i+j-1);// 抽到b且跑了w  

ac代码:https://codeforces.com/contest/148/submission/61839818

codeforces 846F 期望 通过计算每个元素的贡献算期望

题意:给n个数,然后随机生成l,r,如果l>r 交换l,r  ,现在求所有区间l,r 数的种类的期望。

思路:这种题目通过计算每个数的贡献来计算期望 假设这n个数都不同  那么 a[i] 的有贡献区间为 [1,i][1,i+1].....[i,n]共(n-i+1)*i个; 当a[j]==a[i]且 j>i时,先不考虑重复, a[j]的贡献区间为   [1,j][1,j+1]...[j,n] 共 (n-j+1)*j个  这个时候你会发现 a[i]和a[j]的贡献区间有交集,既 那些区间既包括a[i]又包括a[j] 这些区间在a[i]的时候已经算过a[i]的贡献了,a[j]不需要贡献,减去即可;发现这些区间是[1,j][1,j+1]...[1,n].... [i,j][i,j+1]...[i,n] 共 i*[n-j+1]个   那么a[j]的贡献为(n-j+1)*j-i*[n-j+1]=(n-j+1)*(j-i) 那么记录上一个a[j]的位置即可;ac代码:https://codeforces.com/contest/846/submission/61890875

codeforces 678E 概率dp  只知道末状态 倒推 初始状态有多个 最优策略

题意:有n个人进行决斗,最后只有一个人能活下来,现在给你每个人打败其他人的概率,求最后0号选手活下来的概率;

思路:初始状态有很多个,初始化所有的初始状态为1,这样是不行的;但是末状态只有一个,那么这个题目就将末状态初始化为1,然后进行倒推;dp[0][1]=1,状态s中,为1表示活在,dp[i][s]=max(dp[i][s],dp[i][s^(1<

ac代码:https://paste.ubuntu.com/p/qs9m2YrKGs/

codeforces 540D 概率dp 

题意:有三个阵营,石头,剪刀,布,每次有二个不同阵营的人相遇,剪刀越到石头,剪刀就死了,现在给你每个阵营的人数,求最后求最后每个阵营单独活下来的概率;

思路:dp[i][j][k]表示这个状态的概率,dp[x][y][z]=1; sum=i*j+i*k+j*k;

if(i>=1)dp[i-1][j][k]+=dp[i][j][k]*i*k/sum;
if(j>=1)dp[i][j-1][k]+=dp[i][j][k]*j*i/sum;
if(k>=1)dp[i][j][k-1]+=dp[i][j][k]*k*j/sum; 

ac代码:https://codeforces.com/contest/540/submission/61896742

codeforces 912D 期望,每个格子算贡献,bfs

题意:给一个n*m的池塘,有一个r*r的渔网,有k条鱼,这k条鱼随便放在哪个格子,求铺到鱼的最大期望值

思路:我们只要找到被渔网遍历次数最大的k个格子就行了,画个图,用r*r的渔网模拟你会发现,正中间那个格子的用r*r的渔网遍历次数最大,然后在那个格子旁边,遍历次数非增加,那么可以用优先级队列bfs,格子x,y的贡献为  min(x,n+1-x,r,n+1-r)*min(y,m+1-y,r,m+1-r)/(n+1-r)/(m+1-r);这个题目主要是要按每个格子算贡献

ac代码:https://codeforces.com/contest/912/submission/61918666

codeforces 859D 期望dp

题意:有2^n个队伍,共进行n轮比赛,第i轮比赛有2^(n-i)场比赛,每场比赛输的队伍淘汰,赢的队伍按编号从小到大排序,下轮相邻的二个比,第i轮可以猜赢的那2^(n-i)个队伍,第i轮如果全猜中可以得2^(i-1)分,求期望分数最大;

思路:将这些比赛的队伍编号看成线段树的区间,区间(l,r)表示在节点o,(l,r)队伍都可能赢,那么这就是一颗完全二叉树,有n+1层;p[o][i]表示队伍i在节点o表示的区间赢的概率,e[o][i]表示队伍i在编号o表示的区间赢的概率,叶子节点只有一个队伍p[o][i]=1,e[o][i]=0; 然后区间合并即可;

ac代码:https://codeforces.com/contest/859/submission/61954541

你可能感兴趣的:(数学,dp)