小Y的塗鴉 數學期望 dp

2022-08-12 14:12:13 字數 1632 閱讀 2808

題意概述:

現在給出乙個n*n的方格紙,有m個格仔已經被塗黑了。現在小明也來塗格仔,每次等概率地塗格仔(包括已經被塗過的),問期望的塗格仔次數,使得方格紙每一行每一列都至少有乙個格仔被塗過。

資料範圍:

1 ≤ n ≤ 2·103,0 ≤ m ≤ min(n

2, 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 #include2 #include

3 #include4 #include5

#define maxn 200567

intt,n,m,a,b;

8bool

markc[maxn],markr[maxn];

9double

f[maxn][maxn];

1011

void

data_in()

1222}23

void

work()

2430 f[0][0]=0;31

for(int i=0;i<=a;i++)

32for(int j=0;j<=b;j++) if(i!=0||j!=0

)39 printf("

%.5lf\n

",f[a][b]);40}

41int

main()

4250

return0;

51 }

view code

P4316 數學期望 DP

題意 傳送門 p4316 綠豆蛙的歸宿 題解設 f if i fi 為從節點 i ii 走到終點所經過的路徑總長度期望,設節點 i ii 的出度為 deg ideg i degi 那麼有 f i 1deg i e i,j e w ij f j f i frac sum limits w f j fi...

poj 2057 樹形DP,數學期望

題意 有乙隻蝸牛爬上樹睡著之後從樹上掉下來,發現後面的 房子 卻丟在了樹上面,現在這只蝸牛要求尋找它的房子,它又得從樹根開始爬起,現在要求一條路徑使得其找到房子 所要爬行的期望距離最小.爬行距離如下計算,題目規定每乙個分支和枝末都看做是乙個節點,這些節點之間的距離都是1,在分支上可能會有熱心的毛毛蟲...

HDU3853 LOOPS 概率DP數學期望

題目大意 給出乙個n m的矩陣,要求從左上角走到右下角,每次移動消耗兩點能量,並且每次的移動方向是有概率的 回到自身,往右或者往下 輸入的矩陣中的每個位置有三個數,分別表示回到自身 向右移動 向下移動的概率,三者概率和為1,要求輸出從左上角走到右下角需要消耗的能量值的期望。測試資料可能有點問題,會出...