質問の概要の意味:
N * Nは現在グラフ用紙を説明する、Mグリッドが黒くなってきたがあります。ボブは今も(すなわち、コーティングされているなど)等しい確率でコーティングされた各グリッドは、グラフ用紙の各列の各行は、少なくとも1つのグリッドを有するよう求め格子をコーティングの所望の数が、コーティングされ、コーティングされたグリッドです。
データ範囲:
≤1 N- ≤2・10 。3、0≤ M ≤ 分(N- 2、2・10 。3),. 1≤ R&LT I、 C I ≤ N- (所与のコーティングされたグリッド座標です)、
制限時間:1秒、メモリリミット:512メガバイト
分析:
(最終的に完成したが、この問題は水で見に戻ってくるが、彼らはマスターを考えるYY悪い)私は少しは私の脳は少しHaoshiかもしれないと思う持つようになりました
シンプルに考えてみましょう、あなたが特定の値の座標は意味を持ちません見つけることができ、キーは、これらがR行とC列を占めていることを仮定してどのように多くの列、グリッド線の数のためにコーティングされたアカウントであるということです。
残りの行A列Bが塗布されていない、それは実際にはA * Bは、グラフ用紙(A、但し、Bが0であってもよい)の左上隅に位置しているマトリックスとみなすことができます。
F(a、b)は決して少なくともグリッドの数が列ごとに被覆されている期待して行ごとに行B列にコーティングされた発現作るないせ、問題を解決するDP使用を考えるのが自然です。
4例:
1.コーティングようにマイナス1、不変B、その後の確率/ N *(NB)/ N / N *(NB)/ N *はFの寄与(A-1、B)
2.保存コーティングよう次いでB、一定の確率(NA)/ N * B / N、寄与(NA)/ N * B / N * F(B-1)は
3.塗布例えば、B共に縮小/ N * B / N / Nの寄与* B / N * F(A-1、B-1)、次いで確率でその
4.コーティング、B、次いで確率(NA)/ N *(NB)/ N、寄与(NA)/ N *(NB)/ N * F(A、B)を変更しません
次いで、コーティングのコストを追加し、それはDP式(等号缶の左側に第4のセクション)を選別することができます
Fのみ(0、0)を初期化する必要があります= 0 2次元への注意を払うも0時にプッシュされ、特に国境ではありません。
Oの時間複雑(NM)
概要:
予想される需要操作の数、再発方程式DPの内部に作動状態を達成するために必要とすることができます。
ACコード:
1の#include <stdio.hの> 2の#include < ストリング・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 ダブルF [MAXN] [MAXN]。 10 11 ボイド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 のために(INT iは= 1 ; iが<= M; I ++ ){ 19 のscanf(" %D%D "、およびX&Y)。 20 markr [X] = 1、markc [Y] = 1 。 21 } 22 } 23 空隙ワーク() 24 { 25 A = B = N。 26 のために(INT iは= 1 ; I <= N; I ++ ){ 27 であれば(markr [I])A-- 。 28 もし B--(markc [I]) 。 29 } 30 F [ 0 ] [ 0 ] = 0 ; 31 のために(INT iは= 0 ; iが<= A; I ++ ) 32 のための(INT J = 0 ; J <= B; J ++)場合(I =!0 || J =!0 ){ 33 ダブル TMP = 1 。 34 もし(I> =1)TMP + = [I-F 1 ] [j] * I *(NJ)/(N * N)。 35 であれば(j> = 1)TMP + = F [I] [J- 1 ] *(ニッケル)* J /(N * N)。 36 もし(I> = 1 && J> = 1)TMP + = F [I- 1 ] [J- 1 ] * I * J /(N * N)。 37 F [I] [J] = TMP * N * N /(N * N-(ニッケル)*(N- J))。 38 } 39 のprintf(" %.5lf \ n " 、F [A] [B])。 40 } 41 のint main()の 42 { 43 freopenは("test.in " " R " 標準入力); 44 freopenは(" test.outに" " W "STDOUT); 45 のscanf(" %dの」、&T); 46 ながら(T-- ){ 47 DATA_IN (); 48 ワーク(); 49 } 50 リターン0 ; 51 }