小Y的涂鸦 数学期望 dp

题意概述:

  现在给出一个N*N的方格纸,有M个格子已经被涂黑了。现在小明也来涂格子,每次等概率地涂格子(包括已经被涂过的),问期望的涂格子次数,使得方格纸每一行每一列都至少有一个格子被涂过。

数据范围:

  1 ≤ n ≤ 2·103,0 ≤ m ≤ min(n2, 2·103),1 ≤ ri, ci ≤ n  (这是给出的涂过的格子的坐标),

  Time limit : 1 s,Memory limit : 512 mb

分析:

  我开始有一点小小的认为我的脑子可能有点好使了(YY出一个自己认为掌握的很差的东西,虽然最后做完回来看这题很水)

  简单考虑一下,可以发现坐标的具体值是没有任何意义的,关键是这些被涂过的格子占了多少行多少列,假设就占了R行C列。

  那么剩下A行B列没有涂,实际上可以把它看成一个位于方格纸左上角的A*B矩阵(不过A,B可以是0)。

  很自然地想到用dp解决问题,设 f( a , b )表示让没有涂过的a行b列中每行每列至少有一个格子被涂过的期望次数。

  四种情况:

    1.这次涂使得a减一,b不变,那么概率为 a/N*(N-b)/N,贡献 a/N*(N-b)/N * f( a-1 , b )

    2.这次涂使得b减一,a不变,那么概率为 (N-a)/N*b/N,贡献 (N-a)/N*b/N * f( a , b-1 )

    3.这次涂使得a,b一起减一,那么概率为 a/N*b/N,贡献 a/N*b/N * f( a-1 , b-1 )

    4.这次涂并没有改变a,b,那么概率为 (N-a)/N*(N-b)/N,贡献 (N-a)/N*(N-b)/N * f( a , b )

  然后加上这次涂的代价1,那么就可以整理出dp方程(把第四部分移到等号左边即可)

  只需要初始化 f( 0 , 0 ) = 0 即可,没有特别的边界,注意两维为0的时候也要推。

  时间复杂度O(NM)

  总结:求操作的期望次数,那么可能可以把操作需要达到的状态放到dp方程里面去递推。

AC代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdbool.h>
 4 #include<math.h>
 5 #define maxn 2005
 6
 7 int T,N,M,A,B;
 8 bool markc[maxn],markr[maxn];
 9 double f[maxn][maxn];
10
11 void data_in()
12 {
13     memset(f,0,sizeof(f));
14     memset(markc,0,sizeof(markc));
15     memset(markr,0,sizeof(markr));
16     scanf("%d%d",&N,&M);
17     int x,y;
18     for(int i=1;i<=M;i++){
19         scanf("%d%d",&x,&y);
20         markr[x]=1,markc[y]=1;
21     }
22 }
23 void work()
24 {
25     A=B=N;
26     for(int i=1;i<=N;i++){
27         if(markr[i]) A--;
28         if(markc[i]) B--;
29     }
30     f[0][0]=0;
31     for(int i=0;i<=A;i++)
32     for(int j=0;j<=B;j++) if(i!=0||j!=0){
33         double tmp=1;
34         if(i>=1) tmp+=f[i-1][j]*i*(N-j)/(N*N);
35         if(j>=1) tmp+=f[i][j-1]*(N-i)*j/(N*N);
36         if(i>=1&&j>=1) tmp+=f[i-1][j-1]*i*j/(N*N);
37         f[i][j]=tmp*N*N/(N*N-(N-i)*(N-j));
38     }
39     printf("%.5lf\n",f[A][B]);
40 }
41 int main()
42 {
43     freopen("test.in","r",stdin);
44     freopen("test.out","w",stdout);
45     scanf("%d",&T);
46     while(T--){
47         data_in();
48         work();
49     }
50     return 0;
51 }

原文地址:https://www.cnblogs.com/Golden-Elf/p/12081526.html

时间: 2024-10-08 01:16:41

小Y的涂鸦 数学期望 dp的相关文章

数学期望dp

期望dp 数学期望: \(E(X) = \sum {p_ix_i}\) 数学期望是线性函数,满足\(E(aX + By) = a * E(X) + b * E(Y)\) 接下来看两道毒瘤题 绿豆蛙的归宿 对于每个点,它的期望值 = 当前路径长度 / 起点的出度 所以我们先求出每个点的出度--无非就是在加入每条边的时候统计一下 根据数学期望的定义和性质, \[F[x]=\frac{1}{k} \sum_{i = 1}^{k} (F[y_i ]+ z_i)\] 显然我们需要用逆推法,也就需要建反图,

codeforces1097D Makoto and a Blackboard 数学+期望dp

题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! 直接考虑n到因子很难做,所以要研究从n到因子的一些性质. 如果一个数可以写成,p^c这样的形式,并且p是质数,那么如果把这个数进行上述的操作,他可以变成的形式必然是p^x(0<=x<=c),并且每个数的概率是平均的. 所以对于这样的数,我们可以得出dp方程,i表示第几次操作,j表示p^j. dp[

ZOJ3329-One Person Game(概率DP求数学期望)

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very simple and interesting one-person game. You have 3 dice, namelyDie1, Die2 and Die3. Die1 hasK1 faces. Die2 has K2 faces.Die3 has K3 faces. All the dic

[题解]数学期望_luogu_P1850_换教室

数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关(有某概率取上一次某种情况) 所以用 f [ i ] [ j ] [ 0/1 ]记录这次申请与否,然后枚举每种情况用概率乘一下即可 #include<iostream> #include<cstdio> #include<cstring> #include<algori

[2013山东ACM]省赛 The number of steps (可能DP,数学期望)

The number of steps nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; color:rgb(83,113,197); text-decoration:none; padding-top:0px"> Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 Mary

CSU 1290 DP解决数学期望问题

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1290 题目大意: 给定k个数,每次可以生成0-N-1中的任何一个数,k个数中出现不同的整数的个数的数学期望 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 #define N 1005 5 double dp[N]; 6 int main() 7 { 8 int T,k,n; 9 scan

[2013山东ACM省赛] The number of steps (概率DP,数学期望)

The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Mary stands in a strange maze, the maze looks like a triangle(the first layer have one room,the second layer have two rooms,the third layer have three rooms -). Now she st

POJ3682King Arthur&#39;s Birthday Celebration(数学期望||概率DP)

King Arthur is an narcissist who intends to spare no coins to celebrate his coming K-th birthday. The luxurious celebration will start on his birthday and King Arthur decides to let fate tell when to stop it. Every day he will toss a coin which has p

概率与期望dp相关

概率与期望dp 概率 某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A). 假设某事的所有可能结果有n种,每种结果都是等概率,事件A涵盖其中的m种,那么P(A)=m/n. 例如投掷一枚骰子,点数小于3的概率为2/6=1/3. 如果两个事件A和B所涵盖的结果没有交集,那么P(A或B发生)=P(A)+P(B) 还是掷骰子 P(点数小于3或点数大于4)=2/6+2/6=2/3 如果A和B所涵盖的结果有交集 那么P(A或B发生)=P(A)+P(B)-P(A与B同时发生) P(点数小于3或点数