題意概述:
現在給出乙個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 #includeview code3 #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 }
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,要求輸出從左上角走到右下角需要消耗的能量值的期望。測試資料可能有點問題,會出...