Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP
User ainta decided to paint a wall. The wall consists of?n2?tiles, that are arranged in an?n?×?n?table. Some tiles are painted, and the others are not. As he wants to paint it beautifully, he will follow the rules below.
However ainta is worried if it would take too much time to finish this work. So he wants to calculate the expected time needed to paint the wall by the method above. Help him find the expected time. You can assume that choosing and painting any tile consumes no time at all.
InputThe first line contains two integers?n?and?m?(1?≤?n?≤?2·103;?0?≤?m?≤?min(n2,?2·104)) — the size of the wall and the number of painted cells.
Next?m?lines goes, each contains two integers?ri?and?ci?(1?≤?ri,?ci?≤?n) — the position of the painted cell. It is guaranteed that the positions are all distinct. Consider the rows of the table are numbered from?1?to?n. Consider the columns of the table are numbered from1?to?n.
OutputIn a single line print the expected time to paint the wall in minutes. Your answer will be considered correct if it has at most?10?-?4?absolute or relative error.
Sample test(s) input 5 22 3
4 1 output 11.7669491886 input 2 2
1 1
1 2 output 2.0000000000 input 1 1
1 1 output 0.0000000000
題意:有一個n*n的墻,現在小明來刷墻,如果每一行每一列都至少有一個格子刷過了就停止工作,否則每次隨機選一個格子,如果刷過了就不刷如果沒刷過就刷,然后休息一分鐘,求停止工作時時間的數學期望(開始之前已經有m個格子刷過了)
題解:dp[i][j]表示還有i行j列未刷
初始化: dp[i][0]=((n-i)/n)*dp[i][0]+dp[i-1][0]*i/n+1;
dp[0][j]=((n-j)/n)*dp[0][j]+dp[0][j-1]*j/n+1;
轉移: dp[i][j]=dp[i][j]*(n-i)(n-j)/n^2+dp[i-1][j]*(i*(n-j))/n^2+dp[i][j-1]*((n-i)*j)/n^2+dp[i-1][j-1]*(i*j)/n^2+1;
#include<iostream> #include<cstdio> using namespace std; double dp[2010][2010]; int n,m,a[2010],b[2010]; int main() {cin>>n>>m;int x,y;int l=n,r=n;for(int i=0; i<m; i++){cin>>x>>y;if(!a[x]) l--;if(!b[y]) r--;a[x]=1,b[y]=1;}for(int i=1; i<=n; i++) dp[i][0]=dp[i-1][0]+(double)n/i;for(int j=1; j<=n; j++) dp[0][j]=dp[0][j-1]+(double)n/j;for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){dp[i][j]=(dp[i-1][j]*i*(n-j)+n*n+dp[i][j-1]*j*(n-i)+dp[i-1][j-1]*i*j)/(n*n-(n-i)*(n-j));}}printf("%0.10f\n",dp[l][r]);return 0; } 代碼
?
轉載于:https://www.cnblogs.com/zxhl/p/4846283.html
總結
以上是生活随笔為你收集整理的Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惊人体积,无码改造,黑月V1.7.4增强
- 下一篇: malloc/free与new/dele